173

Suppose I have and m x n array. I want to pass each column of this array to a function to perform some operation on the entire column. How do I iterate over the columns of the array?

For example, I have a 4 x 3 array like

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

for column in array:
  some_function(column)

where column would be "1,2,3,4" in the first iteration, "99,14,12,43" in the second, and "2,5,7,1" in the third.

1

10 Answers 10

303

Just iterate over the transposed of your array:

for column in array.T:
   some_function(column)
Sign up to request clarification or add additional context in comments.

3 Comments

What would be a good way to combine the result back into a single array?
For those wondering, array.T isn't costly, as it just changes the 'strides' of array (see this answer for an interesting discussion)
Is there a way of iterating which keeps the vectors as column vectors?
29

This should give you a start

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


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

4 Comments

It doesn't look pythonic to me.
@gronostaj Of course it's Pythonic. How else would you solve this problem when you want to iterate over an arbitrary axis of a multidimensional array?
@NeilG This question is strictly about 2-dimensional arrays.
Accepted answer looks good on SO. This saves the day!
8

For a three dimensional array you could try:

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

See the docs on how array.transpose works. Basically you are specifying which dimension to shift. In this case we are shifting the second dimension (e.g. columns) to the first dimension.

Comments

7

You can also use unzip to iterate through the columns

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

2 Comments

Interesting. This returns tuples instead of arrays. And it's much faster.
I have a hunch that the result of this might depend on the storage order of the numpy array ('C' or 'F') - it may return columns in one case and rows in the other. I'm not sure though - just a warning, better check before using this. It doesn't look safe.
5
for c in np.hsplit(array, array.shape[1]):
    some_fun(c)

1 Comment

this one is the only one returning column_vectors.
4

The question is old but for anyone looking nowadays.

You can iterate through the rows of a numpy array like this:

for row in array:
    some_function(row) # do something here

So to iterate through the columns of a 2D array you can simply transpose it like this:

transposed_array = array.T

#Now you can iterate through the columns like this:
for column in transposed_array:
    some_function(column) # do something here

If you want to collect the results of each column into a list for example, you can use list comprehension.

[some_function(column) for column in array.T]

So in summary you can perform a function on each column of an array and collect the results into a list using this line of code:

result_list = [some_function(column) for column in array.T]

Comments

2

For example you want to find a mean of each column in matrix. Let's create the following matrix

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

The function for mean is

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

To do what is needed and store result in colon vector 'results'

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

results = mat2[1,:]      

The results are: array([4.33333333, 5. , 5.66666667, 4. ])

Comments

0

NumPy arrays have built-in methods for stuff like this.

print(list(T.mean(axis=0)))
# [2.5, 42.0, 3.75]

In 2-dim arrays, axis 0 is the column dimension.

Sorry I answered this 10 years & 4 months too late.

Comments

-1

Alternatively, you can use enumerate. It gives you the column number and the column values as well.

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 


1 Comment

This isn't really adding anything to solve the problem. The problem doesn't ask for indices, just columns, and enumerate is a general Python utility unrelated to numpy. array.T was posted years ago.
-1

list -> array -> matrix -> matrix.T

import numpy as np

list = [1, 99, 2, 2, 14, 5, 3, 12, 7, 4, 43, 1]
arr_n = np.array(list) # list -> array
print(arr_n)
matrix = arr_n.reshape(4, 3) # array -> matrix(4*3)
print(matrix)
print(matrix.T) # matrix -> matrix.T



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

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

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.