Croyez-le ou non, après avoir profilé mon code actuel, l'opération répétitive de réversion du tableau numpy a mangé une partie géante du temps d'exécution. Ce que j'ai en ce moment, c'est la méthode commune basée sur la vue:
reversed_arr = arr[::-1]
Y a-t-il une autre façon de le faire plus efficacement, ou est-ce juste une illusion de mon obsession pour les performances numpy irréalistes?
arr[::-1]
renvoie juste une vue inversée. C'est aussi rapide que possible et ne dépend pas du nombre d'éléments dans le tableau, car cela ne fait que changer les foulées. Est-ce que ce que vous inversez est en fait un tableau numpy?arr
est un tableau numpy.f2py
est votre ami! Il est souvent utile d'écrire des parties critiques d'un algorithme (en particulier dans le calcul scientifique) dans un autre langage et de l'appeler à partir de python. Bonne chance!arr[::-1]
: github.com/numpy/numpy/blob/master/numpy/lib/twodim_base.py . Recherchezdef flipud
. La fonction comporte littéralement quatre lignes.Réponses:
Lorsque vous créez,
reversed_arr
vous créez une vue dans le tableau d'origine. Vous pouvez ensuite modifier le tableau d'origine et la vue sera mise à jour pour refléter les modifications.Recréez-vous la vue plus souvent que nécessaire? Vous devriez pouvoir faire quelque chose comme ceci:
Je ne suis pas un expert numpy, mais cela semble être le moyen le plus rapide de faire les choses en numpy. Si c'est ce que vous faites déjà, je ne pense pas que vous puissiez l'améliorer.
PS Grande discussion des vues numpy ici:
Vue sur un tableau numpy?
la source
look_at
fonction supposée faire?reversed_arr
est toujours utilisable après la modification des données sous-jacentes. L'écriture de nouvelles valeurs dans le tableau n'invalide pas la vue. En fait, vous pouvez également utiliser la vue pour écrire de nouvelles valeurs dans le tableau.reversed_arr[0] = 99
définirait le dernier élément du tableau sur 99, commearr[-1] = 99
pour.Comme mentionné ci-dessus,
a[::-1]
ne crée vraiment qu'une vue, c'est donc une opération à temps constant (et en tant que telle, ne prend pas plus de temps à mesure que le tableau grandit). Si vous avez besoin que le tableau soit contigu (par exemple parce que vous effectuez de nombreuses opérations vectorielles avec lui),ascontiguousarray
est à peu près aussi rapide queflipup
/fliplr
:Code pour générer le tracé:
la source
Parce que cela ne semble pas encore être marqué comme une réponse ... La réponse de Thomas Arildsen devrait être la bonne: utilisez simplement
s'il s'agit d'un tableau 1d (tableau de colonnes).
Avec matrizes faire
si vous voulez inverser les lignes et
flipud(matrix)
si vous voulez retourner les colonnes. Pas besoin de faire de votre tableau de colonnes 1d un tableau de lignes en 2 dimensions (matrice avec une couche None), puis de le retourner.la source
np.fliplr()
retourne le tableau de gauche à droite.Notez que pour les tableaux 1d, vous devez le tromper un peu:
la source
reversed_arr = np.flipud(arr1d)
semble fonctionner directement.Je développerai la réponse précédente à propos de
np.fliplr()
. Voici du code qui montre comment construire un tableau 1d, le transformer en tableau 2d, le retourner, puis reconvertir en tableau 1d.time.clock()
sera utilisé pour garder le temps, qui est présenté en termes de secondes.Avec une déclaration imprimée non commentée:
Avec une déclaration imprimée commentée:
Donc, en termes d'efficacité, je pense que c'est décent. Pour ceux d'entre vous qui aiment le faire en une seule ligne, voici ce formulaire.
la source
En développant ce que les autres ont dit, je vais donner un court exemple.
Si vous avez un tableau 1D ...
Mais si vous travaillez avec un tableau 2D ...
Cela n'inverse pas réellement la matrice.
Devrait utiliser np.flip pour inverser réellement les éléments
Si vous souhaitez imprimer les éléments d'une matrice un par un, utilisez-les à plat avec retournement
la source
Pour le faire fonctionner avec des nombres négatifs et une longue liste, vous pouvez effectuer les opérations suivantes:
Où flipud est pour 1d arra
la source