Numpy cómo iterar sobre columnas de matriz?

109

Supongamos que tengo una matriz mxn. Quiero pasar cada columna de esta matriz a una función para realizar alguna operación en toda la columna. ¿Cómo iterar sobre las columnas de la matriz?

Por ejemplo, tengo una matriz de 4 x 3 como

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

for column in array:
  some_function(column)

donde la columna sería "1,2,3,4" en la primera iteración, "99,14,12,43" en la segunda y "2,5,7,1" en la tercera.

Usuario
fuente
2
¿No puedes usar un índice --- stackoverflow.com/questions/4455076/…
ev-br

Respuestas:

225

Simplemente repita la transposición de su matriz:

for column in array.T:
   some_function(column)
tillsten
fuente
6
¿Cuál sería una buena forma de volver a combinar el resultado en una sola matriz?
Ibrahim Muhammad
46
Para aquellos que se preguntan, array.Tno es costoso, ya que solo cambia los 'pasos' de array(vea esta respuesta para una discusión interesante)
drevicko
19

Esto debería darte un comienzo

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


[1 2 3 4]
[99 14 12 43]
[2 5 7 1]
Abhijit
fuente
7
No me parece pitónico.
gronostaj
@gronostaj Por supuesto que es Pythonic. ¿De qué otra manera resolvería este problema cuando desee iterar sobre un eje arbitrario de una matriz multidimensional?
Neil G
1
@NeilG Esta pregunta es estrictamente sobre matrices bidimensionales.
gronostaj
6

Para una matriz tridimensional, puede probar:

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

Consulte los documentos sobre cómo array.transposefunciona. Básicamente, está especificando qué dimensión cambiar. En este caso, estamos cambiando la segunda dimensión (por ejemplo, columnas) a la primera dimensión.

stevej
fuente
5
for c in np.hsplit(array, array.shape[1]):
    some_fun(c)
EricX
fuente
4

También puede usar descomprimir para recorrer las columnas

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

Por ejemplo, desea encontrar la media de cada columna en la matriz. Creemos la siguiente matriz

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

La función de la media es

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

Para hacer lo que se necesita y almacenar el resultado en los 'resultados' del vector de colon

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

results = mat2[1,:]      

Los resultados son: array ([4.33333333, 5., 5.66666667, 4.])

Lucy Nowacki
fuente
0

Alternativamente, puede usar enumerate. Le da el número de columna y los valores de columna también.

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 

Bancos
fuente