Numpy, jak iterować po kolumnach tablicy?

109

Załóżmy, że mam tablicę i mxn. Chcę przekazać każdą kolumnę tej tablicy do funkcji wykonującej jakąś operację na całej kolumnie. Jak iterować po kolumnach tablicy?

Na przykład mam tablicę 4 x 3, taką jak

1  99 2
2  14 5
3  12 7
4  43 1

for column in array:
  some_function(column)

gdzie kolumna to „1,2,3,4” w pierwszej iteracji, „99,14,12,43” w drugiej i „2,5,7,1” w trzeciej.

Użytkownik
źródło
2
Nie możesz użyć indeksu --- stackoverflow.com/questions/4455076/ ...
ev-br

Odpowiedzi:

225

Po prostu wykonaj iterację po transpozycji swojej tablicy:

for column in array.T:
   some_function(column)
tillsten
źródło
6
Jaki byłby dobry sposób na połączenie wyniku z powrotem w jedną tablicę?
Ibrahim Muhammad
46
Dla tych, którzy się zastanawiają, array.Tnie jest kosztowne, ponieważ zmienia tylko „kroki” array(zobacz tę odpowiedź na ciekawą dyskusję)
drevicko
19

To powinno dać ci początek

>>> for col in range(arr.shape[1]):
    some_function(arr[:,col])


[1 2 3 4]
[99 14 12 43]
[2 5 7 1]
Abhijit
źródło
7
Nie wygląda to dla mnie pytonicznie.
gronostaj
@gronostaj Oczywiście, że to Pythonic. Jak inaczej mógłbyś rozwiązać ten problem, gdy chcesz iterować po dowolnej osi wielowymiarowej tablicy?
Neil G
1
@NeilG To pytanie dotyczy ściśle dwuwymiarowych tablic.
gronostaj
6

Aby uzyskać trójwymiarową tablicę, możesz spróbować:

for c in array.transpose(1, 0, 2):
    do_stuff(c)

Zobacz dokumentację, aby dowiedzieć się, jak to array.transposedziała. Zasadniczo określasz, który wymiar ma zostać przesunięty. W tym przypadku przesuwamy drugi wymiar (np. Słupy) do pierwszego wymiaru.

stevej
źródło
5
for c in np.hsplit(array, array.shape[1]):
    some_fun(c)
EricX
źródło
4

Możesz także użyć polecenia unzip, aby iterować po kolumnach

for col in zip(*array):
   some_function(col)
Adi
źródło
2

Na przykład chcesz znaleźć średnią z każdej kolumny w macierzy. Stwórzmy następującą macierz

mat2 = np.array([1,5,6,7,3,0,3,5,9,10,8,0], dtype=np.float64).reshape(3, 4)

Funkcja średniej to

def my_mean(x):
    return sum(x)/len(x)

Aby zrobić to, co jest potrzebne i zapisać wynik w „wynikach” wektora okrężnicy

results = np.zeros(4)
for i in range(0, 4):
    mat2[:, i] = my_mean(mat2[:, i])

results = mat2[1,:]      

Wyniki to: tablica ([4.33333333, 5., 5.66666667, 4.])

Lucy Nowacki
źródło
0

Alternatywnie możesz użyć enumerate. Podaje numer kolumny i jej wartości.

for num, column in enumerate(array.T):
    some_function(column) # column: Gives you the column value as asked in the question
    some_function(num) # num: Gives you the column number 


Banki
źródło