29

如果我有一个 NumPy 数组,例如 5x3,有没有办法一次将其逐列解包以传递给函数,而不是像这样:my_func(arr[:, 0], arr[:, 1], arr[:, 2])

有点像*args列表解包但按列。

4

3 回答 3

34

您可以解压缩数组的转置,以便将列用作函数参数:

my_func(*arr.T)

这是一个简单的例子:

>>> x = np.arange(15).reshape(5, 3)
array([[ 0,  5, 10],
       [ 1,  6, 11],
       [ 2,  7, 12],
       [ 3,  8, 13],
       [ 4,  9, 14]])

让我们编写一个函数来将列添加在一起(通常x.sum(axis=1)在 NumPy 中完成):

def add_cols(a, b, c):
    return a+b+c

然后我们有:

>>> add_cols(*x.T)
array([15, 18, 21, 24, 27])

NumPy 数组将沿第一个维度解包,因此需要转置数组。

于 2014-11-20T18:36:59.240 回答
15

numpy.split将一个数组拆分为多个子数组。在您的情况下,indices_or_sections是 3,因为您有 3 列,并且axis = 1我们按列拆分。

my_func(numpy.split(array, 3, 1))
于 2016-08-03T18:32:45.717 回答
1

估计numpy.split以后还不够。相反,它应该是

my_func(tuple(numpy.split(array, 3, 1)))

目前,python 打印以下警告:

FutureWarning:不推荐使用非元组序列进行多维索引;使用arr[tuple(seq)]而不是arr[seq]. 将来,这将被解释为数组索引, arr[np.array(seq)]这将导致错误或不同的结果。

于 2019-07-24T15:07:23.187 回答