Numpy如何遍历数组的列?

Posted

技术标签:

【中文标题】Numpy如何遍历数组的列?【英文标题】:Numpy how to iterate over columns of array? 【发布时间】:2012-04-26 06:56:20 【问题描述】:

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

例如,我有一个 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”。

【问题讨论】:

你不能使用索引吗 --- ***.com/questions/4455076/… 【参考方案1】:

只需遍历数组的转置:

for column in array.T:
   some_function(column)

【讨论】:

将结果组合回单个数组的好方法是什么? 对于那些想知道的人来说,array.T 并不昂贵,因为它只是改变了array 的“步伐”(请参阅​​this answer 进行有趣的讨论) 有没有一种迭代方法可以将向量保持为列向量?【参考方案2】:

这应该给你一个开始

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


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

【讨论】:

我觉得它不像 pythonic。 @gronostaj 当然是 Pythonic。当你想遍历多维数组的任意轴时,你会如何解决这个问题? @NeilG 这个问题是关于二维数组的。【参考方案3】:

您也可以使用 unzip 来遍历列

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

【讨论】:

有趣。这将返回元组而不是数组。而且速度要快得多。 我有一种预感,这可能取决于 numpy 数组(“C”或“F”)的存储顺序 - 它可能在一种情况下返回列,在另一种情况下返回行。不过我不确定 - 只是一个警告,在使用它之前最好检查一下。它看起来不安全。【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:
for c in np.hsplit(array, array.shape[1]):
    some_fun(c)

【讨论】:

【参考方案6】:

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

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,:]      

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

【讨论】:

【参考方案7】:

这个问题很老,但对于现在看的人来说。

您可以像这样遍历 numpy 数组的行:

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

所以要遍历二维数组的列,您可以像这样简单地转置它:

transposed_array = array.T

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

例如,如果你想将每一列的结果收集到一个列表中,你可以使用列表推导。

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

因此,总而言之,您可以对数组的每一列执行一个函数,并使用这行代码将结果收集到一个列表中:

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

【讨论】:

这并没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。【参考方案8】:

或者,您可以使用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 


【讨论】:

【参考方案9】:

列表 -> 数组 -> 矩阵 -> 矩阵.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如何遍历数组的列?的主要内容,如果未能解决你的问题,请参考以下文章

如何遍历Python中的列?

strides 如何帮助在 numpy 中遍历数组?

python运算学习之Numpy ------ 数组的切片索引与循环遍历条件和布尔数组

遍历 numpy.ma 数组,忽略掩码值

如何伸缩 numpy 数组的列?

如何向 NumPy 数组添加额外的列