Numpy comment parcourir les colonnes du tableau?

109

Supposons que j'ai un tableau et mxn. Je veux passer chaque colonne de ce tableau à une fonction pour effectuer une opération sur toute la colonne. Comment parcourir les colonnes du tableau?

Par exemple, j'ai un tableau 4 x 3 comme

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

for column in array:
  some_function(column)

où la colonne serait "1,2,3,4" dans la première itération, "99,14,12,43" dans la seconde et "2,5,7,1" dans la troisième.

Utilisateur
la source
2
Vous ne pouvez pas utiliser un index --- stackoverflow.com/questions/4455076/…
ev-br

Réponses:

225

Répétez simplement la transposition de votre tableau:

for column in array.T:
   some_function(column)
tillsten
la source
6
Quel serait un bon moyen de combiner le résultat en un seul tableau?
Ibrahim Muhammad
46
Pour ceux qui se demandent, ce array.Tn'est pas coûteux, car cela change simplement les `` enjambées '' de array(voir cette réponse pour une discussion intéressante)
drevicko
19

Cela devrait vous donner un bon départ

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


[1 2 3 4]
[99 14 12 43]
[2 5 7 1]
Abhijit
la source
7
Cela ne me paraît pas pythonique.
gronostaj
@gronostaj Bien sûr, c'est Pythonic. Sinon, comment résoudriez-vous ce problème lorsque vous souhaitez itérer sur un axe arbitraire d'un tableau multidimensionnel?
Neil G
1
@NeilG Cette question concerne strictement les tableaux à 2 dimensions.
gronostaj
6

Pour un tableau en trois dimensions, vous pouvez essayer:

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

Consultez la documentation sur son array.transposefonctionnement. En gros, vous spécifiez la dimension à décaler. Dans ce cas, nous déplaçons la deuxième dimension (par exemple les colonnes) vers la première dimension.

Stevej
la source
5
for c in np.hsplit(array, array.shape[1]):
    some_fun(c)
EricX
la source
4

Vous pouvez également utiliser unzip pour parcourir les colonnes

for col in zip(*array):
   some_function(col)
Adi
la source
2

Par exemple, vous voulez trouver une moyenne de chaque colonne dans la matrice. Créons la matrice suivante

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

La fonction de la moyenne est

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

Pour faire ce qui est nécessaire et stocker le résultat dans les `` résultats '' du vecteur deux-points

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

results = mat2[1,:]      

Les résultats sont: array ([4.33333333, 5., 5.66666667, 4.])

Lucy Nowacki
la source
0

Vous pouvez également utiliser enumerate. Il vous donne également le numéro de colonne et les valeurs de colonne.

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 

Banques
la source