Soru Sayısal bir dizi üzerinde yineleme


Buna daha az ayrıntılı bir alternatif var mı:

for x in xrange(array.shape[0]):
    for y in xrange(array.shape[1]):
        do_stuff(x, y)

Ben bununla geldim:

for x, y in itertools.product(map(xrange, array.shape)):
    do_stuff(x, y)

Hangi bir girinti kaydeder, ama hala çok çirkin.

Bu sahte kod gibi görünen bir şey umuyorum:

for x, y in array.indices:
    do_stuff(x, y)

Böyle bir şey var mı?


103
2017-08-06 14:27


Menşei


Ben python 2.7'deyim ve çözümünüzü itertools ile kullanıyorum; Itertools kullanarak daha hızlı olacak yorumlarda okudum. Ancak, (belki de 2.7'de olduğum için), aynı zamanda for döngüsünde haritayı açmak zorunda kaldım. for x, y in itertools.product(*map(xrange, array.shape)): - ALM


Cevaplar:


Sanırım sen arıyorsun ndenumerate.

>>> a =numpy.array([[1,2],[3,4],[5,6]])
>>> for (x,y), value in numpy.ndenumerate(a):
...  print x,y
... 
0 0
0 1
1 0
1 1
2 0
2 1

Performans ile ilgili. Liste anlamadan biraz daha yavaştır.

X = np.zeros((100, 100, 100))

%timeit list([((i,j,k), X[i,j,k]) for i in range(X.shape[0]) for j in range(X.shape[1]) for k in range(X.shape[2])])
1 loop, best of 3: 376 ms per loop

%timeit list(np.ndenumerate(X))
1 loop, best of 3: 570 ms per loop

Eğer performanstan endişe ediyorsanız, uygulamanın daha iyi görünmesini sağlayabilirsiniz. ndenumerate2 şey yapar, bir diziye dönüşür ve döngü yapar. Eğer bir dizinin olduğunu biliyorsan, .coords Düz yineleyicinin özelliği.

a = X.flat
%timeit list([(a.coords, x) for x in a.flat])
1 loop, best of 3: 305 ms per loop

154
2017-08-06 14:31



Bu işe yarıyor ama inanılmaz derecede yavaş. Manuel olarak yinelemek daha iyi. - Marty


Yalnızca endekslere ihtiyacınız varsa, deneyebilirsiniz numpy.ndindex:

>>> a = numpy.arange(9).reshape(3, 3)
>>> [(x, y) for x, y in numpy.ndindex(a.shape)]
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

35
2017-08-06 14:38





görmek nditer

import numpy as np
Y = np.array([3,4,5,6])
for y in np.nditer(Y, op_flags=['readwrite']):
    y += 3

Y == np.array([6, 7, 8, 9])

y = 3 işe yaramaz, kullan y *= 0 ve y += 3 yerine.


10
2018-01-07 09:53



veya y [...] = 3 kullanın - Donald Hobson