numpy如何迭代数组的列?


109

假设我有和mxn数组。我想将此数组的每一列传递给函数,以对整个列执行一些操作。如何遍历数组的列?

例如,我有一个4 x 3的数组

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

for column in array:
  some_function(column)

其中列在第一次迭代中将为“ 1,2,3,4”,在第二次迭代中为“ 99,14,12,43”,在第三次迭代中为“ 2,5,7,1”。


2
你不能用一个指标--- stackoverflow.com/questions/4455076/...
EV-BR

Answers:


225

只需遍历数组的转置即可:

for column in array.T:
   some_function(column)

6
将结果组合回单个数组的好方法是什么?
易卜拉欣·穆罕默德

46
对于那些想知道的人来说,array.T这并不昂贵,因为它只是改变了它的“步伐” array(请参阅此答案进行有趣的讨论)
drevicko 2014年

19

这应该给你一个开始

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


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

7
在我看来,它看起来不是pythonic。
gronostaj 2014年

@gronostaj当然是Pythonic。当您要遍历多维数组的任意轴时,如何解决此问题?
Neil G

1
@NeilG这个问题严格来说是关于二维数组的。
gronostaj

6

对于三维数组,您可以尝试:

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

请参阅有关array.transpose工作原理的文档。基本上,您要指定要移动的尺寸。在这种情况下,我们将第二维(例如列)移动到第一维。



4

您还可以使用解压缩来遍历各列

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

2

例如,您要查找矩阵中每一列的平均值。让我们创建以下矩阵

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

均值的函数是

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

执行所需的操作并将结果存储在结肠向量“结果”中

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

results = mat2[1,:]      

结果是:array([4.33333333,5.,5.66666667,4.])


0

或者,您可以使用enumerate。它也为您提供列号和列值。

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 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.