Czy istnieje mniej szczegółowa alternatywa dla tego:
for x in xrange(array.shape[0]):
for y in xrange(array.shape[1]):
do_stuff(x, y)
Wymyśliłem to:
for x, y in itertools.product(map(xrange, array.shape)):
do_stuff(x, y)
Co oszczędza jedno wcięcie, ale nadal jest dość brzydkie.
Mam nadzieję na coś, co wygląda jak ten pseudokod:
for x, y in array.indices:
do_stuff(x, y)
Czy coś takiego istnieje?
for x, y in itertools.product(*map(xrange, array.shape)):
Odpowiedzi:
Myślę, że szukasz ndenumerate .
Jeśli chodzi o wydajność. Jest to trochę wolniejsze niż rozumienie listy.
Jeśli martwisz się o wydajność, możesz nieco bardziej zoptymalizować, patrząc na implementację
ndenumerate
, która robi 2 rzeczy, konwertując na tablicę i zapętlając. Jeśli wiesz, że masz tablicę, możesz wywołać.coords
atrybut płaskiego iteratora.źródło
Jeśli potrzebujesz tylko indeksów, możesz spróbować
numpy.ndindex
:źródło
zobacz nditer
źródło