2 votes

Existe-t-il une notation Python équivalente à (i+1)%N ?

J'ai un tableau numpy Python que j'utilise pour une simulation avec des conditions limites toroïdales.

Par exemple, à la frontière lorsque i = N-1 , i+1 devient 0.

J'utilise a[(i+1)%N, (j+1)%N] pour accéder aux voisins les plus proches, de sorte que l'index s'enroule automatiquement autour d'eux.

Je me demande s'il existe un moyen plus rapide de faire cela, en utilisant la syntaxe de découpage de Python/Numpy.

1voto

JAB Points 11053

Tirez parti de l'indexation négative de Python.

a[(i+1)-N, (j+1)-N]

est équivalent à votre version utilisant modulo. Preuve :

>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> for i in range(len(a)):
    print(a[(i+1)%len(a)], a[i+1-len(a)])

2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
1 1

Si les limites sont plus petites que les longueurs des axes du tableau, vous pouvez prendre une tranche du tableau avec les bonnes limites (ce qui ne devrait pas utiliser trop de mémoire dans numpy, car il s'agira juste d'une vue dans le tableau original) et ensuite utiliser la méthode d'indexation négative.

0voto

Pablo Points 816

Vous pouvez essayer avec des produits similaires :

n = 10
a = range(n)
for i in range(n):
   print a[i-1],a[i],a[i-(n-1)]

Je ne connais pas les performances de "+-" par rapport à "%", mais je pense que c'est plus rapide qu'avec %.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X