एक सुन्न सरणी पर Iterating


135

क्या इसके लिए कोई क्रिया विकल्प कम है:

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

मैं इसके साथ आया:

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

जो एक इंडेंटेशन बचाता है, लेकिन अभी भी बहुत बदसूरत है।

मैं कुछ ऐसी चीज़ की उम्मीद कर रहा हूँ जो इस छद्म कोड की तरह दिखती है:

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

क्या ऐसा कुछ मौजूद है?


मैं अजगर २.th में हूं और आपके समाधान का उपयोग इटर्स्टूल के साथ कर रहा हूं; मैं टिप्पणियों में पढ़ा कि itertools का उपयोग तेजी से हो जाएगा। हालाँकि, (हो सकता है कि मैं 2.7 में हूं) क्योंकि मुझे भी लूप के लिए मैप अनपैक करना पड़ा था। for x, y in itertools.product(*map(xrange, array.shape)):
ALM

NumPy के संदर्भ में एक पृष्ठ है जिसे " इरेटिंग
केसी

जवाबों:


187

मुझे लगता है कि आप 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

प्रदर्शन के संबंध में। यह सूची की समझ से थोड़ा धीमा है।

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

यदि आप उस प्रदर्शन के बारे में चिंतित हैं ndenumerate, जिसके कार्यान्वयन को देखकर आप थोड़ा और अनुकूलित कर सकते हैं , जो 2 चीजें करता है, तो एक सरणी और लूप में परिवर्तित होता है। यदि आप जानते हैं कि आपके पास एक सरणी है, तो आप .coordsफ्लैट पुनरावृत्त की विशेषता कह सकते हैं ।

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

1
ध्यान दें कि यह काम करता है लेकिन अविश्वसनीय रूप से धीमा है। आप मैन्युअल रूप से पुनरावृति के लिए बेहतर हैं।
मार्टी

43

यदि आपको केवल सूचकांकों की आवश्यकता है, तो आप कोशिश कर सकते हैं 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)]

15

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 काम नहीं करेगा, उपयोग करें y *= 0 और y += 3इसके बजाय।


2
या y [...] = 3 का उपयोग करें
डोनाल्ड होब्सन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.