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.


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)

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]

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.



4

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

for col in zip(*array):
   some_function(col)

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.])


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 


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.