2010-08-18 6 views
8

Mam wielowymiarową tablicę numpy i potrzebuję do iteracji w danym wymiarze. Problem polega na tym, że nie będę znał wymiaru , który ma wymiar do czasu wykonania. Innymi słowy, biorąc pod tablicą m, mógłbym chciećPowtórzenie w dowolnym wymiarze w numpy

m[:,:,:,i] for i in xrange(n) 

lub mogłyby chcę

m[:,:,i,:] for i in xrange(n) 

itp

sobie wyobrazić, że nie musi być prosta funkcja w numpy napisać , ale nie wiem, co to jest/jak to się nazywa. jakieś pomysły?

+1

Możliwy duplikat http://stackoverflow.com/questions/1589706/iterating-over-arbitrary-dimension-of-numpy-array – katrielalex

Odpowiedz

6

Istnieje wiele sposobów, aby to zrobić. Możesz zbudować odpowiedni indeks z listą wycinków, lub może zmienić kroki na m. Jednak najprostszym sposobem może być użycie np.swapaxes:

import numpy as np 
m=np.arange(24).reshape(2,3,4) 
print(m.shape) 
# (2, 3, 4) 

Let axis być oś chcesz pętli nad. m_swapped jest taki sam, jak m, z wyjątkiem osi axis=1 z ostatnią (axis=-1) osią.

axis=1 
m_swapped=m.swapaxes(axis,-1) 
print(m_swapped.shape) 
# (2, 4, 3) 

Teraz można po prostu pętla ciągu ostatniej osi Państwo:

for i in xrange(m_swapped.shape[-1]): 
    assert np.all(m[:,i,:] == m_swapped[...,i]) 

Zauważ, że m_swapped jest widokiem, a nie kopia, od m. Zmiana m_swapped zmieni m.

m_swapped[1,2,0]=100 
print(m) 
assert(m[1,0,2]==100) 
+0

Dzięki! Dla zapisu, .swapaxes() zrobił lewę za to, co chciałem zrobić. – chimeracoder

3

Możesz użyć slice(None) zamiast :. Na przykład,

from numpy import * 

d = 2 # the dimension to iterate 

x = arange(5*5*5).reshape((5,5,5)) 
s = slice(None) # : 

for i in range(5): 
    slicer = [s]*3 # [:, :, :] 
    slicer[d] = i # [:, :, i] 
    print x[slicer] # x[:, :, i] 
+0

+1 Jest to zdecydowanie najlepsze rozwiązanie do uogólniania n-wymiarowych tensorów, np. wymiary "a1 x a2 x a3 x a4 x ... x an" –

Powiązane problemy