Numpy how to iterate over columns of array?
Question:
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.
Answers:
Just iterate over the transposed of your array:
for column in array.T:
some_function(column)
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]
for c in np.hsplit(array, array.shape[1]):
some_fun(c)
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.
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. ])
You can also use unzip to iterate through the columns
for col in zip(*array):
some_function(col)
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
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]
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]]
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.
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.
Just iterate over the transposed of your array:
for column in array.T:
some_function(column)
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]
for c in np.hsplit(array, array.shape[1]):
some_fun(c)
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.
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. ])
You can also use unzip to iterate through the columns
for col in zip(*array):
some_function(col)
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
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]
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]]
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.