2

I have a Python numpy array that I am using for a simulation with toroidal boundary conditions.

For example, at the boundary when i = N-1, i+1 becomes 0.

I am using a[(i+1)%N, (j+1)%N] for accessing nearest neighbors so the index automatically wraps around.

Just wondering if there's a faster way to do this, using the Python/Numpy slicing syntax.

M-V
  • 5,167
  • 7
  • 52
  • 55

2 Answers2

1

Take advantage of Python's negative indexing.

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

is equivalent to your version using modulo. Proof:

>>> 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

If the boundaries are smaller than the lengths of the axes of the array, you could take a slice of the array with the right boundaries (which shouldn't use too much memory in numpy, as it will just be a view into the original array) and then use the negative indexing method.

JAB
  • 20,783
  • 6
  • 71
  • 80
0

You could try with some similar to:

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

I don't know the performance "+-" vs "%", but I believe that is faster than with %.

Pablo
  • 2,443
  • 1
  • 20
  • 32