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.


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)

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]

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.


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

4

También puede usar descomprimir para recorrer las columnas

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

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


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 

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.