如果我有一个NumPy数组,例如5x3,有没有办法一列一列地解压缩它以传递给函数而不是像这样:my_func(arr[:, 0], arr[:, 1], arr[:, 2])
?
有点像*args
列表解包但是按列。
答案 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)]
,它将导致错误或不同的结果。