按列解压缩NumPy数组

时间:2014-11-20 18:07:36

标签: python arrays numpy argument-unpacking

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

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

3 个答案:

答案 0 :(得分:21)

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

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]])

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

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

然后我们有:

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

NumPy数组将沿第一维解压缩,因此需要转置数组。

答案 1 :(得分:9)

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

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

答案 2 :(得分:1)

我想numpy.split在将来还不够用。相反,它应该是

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

目前python会显示以下警告:

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