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.