将自定义函数应用于numpy中的2个或更多行(或列)

时间:2018-12-06 08:20:05

标签: python arrays numpy scipy

我对numpy.并不陌生,我想将自定义函数应用于1、2或更多行(或列)。我怎样才能做到这一点?在将此标记为重复之前,我想指出,我发现执行此操作的唯一线程是how to apply a generic function over numpy rows?how to apply a generic function over numpy rows?。这篇文章有两个问题:

a)作为一个初学者,我不太确定像A[:,None,:]这样的操作是做什么的。

b)在我的情况下,该操作无效。请参见下面。

我们假设矩阵M为:

import numpy as np
M = np.array([[8, 3, 2],
              [6, 1, 2],
              [1, 2, 4]])

现在,我想计算所有三行组合的乘积。为此,我创建了一个自定义函数。函数的实际操作可能不同于乘法。乘法只是一个例子。

def myf(a,b): return(a*b) 

我以numpy阵列产品为例。实际的自定义函数可能有所不同,但是无论操作是什么,该函数将始终返回numpy数组。即需要两个相等大小的numpy一维数组并返回一维数组。在myf中,我假设ab分别是np.array

我希望能够将自定义函数应用于任意两行或两列,甚至三行(递归应用函数)。

将两行递归相乘后的预期输出:

如果我应用成对的行操作:

[[48,3,4],
 [6,2,8],
 [8,6,8]]

OR(自定义函数的应用顺序无关紧要。因此,输出矩阵中行的实际位置无关紧要。在矩阵下面也可以。)

[[6,2,8],
 [48,3,4],  #row1 and 2 are swapped
 [8,6,8]]

类似地,如果我对列应用成对运算,我会得到

[[24, 6, 16]
 [6,  2, 12] 
 [2,  8, 4]]

类似地,如果我将自定义函数应用于所有三行,我将得到:

[48,6,16] #row-wise

OR

[48,12,8] #column-wise

我读完SO后尝试了几种方法:

1:

vf=np.vectorize(myf)
vf(M,M)

但是,以上函数将自定义函数按元素而不是按行或按列应用。

2:

我也尝试过:

M[:,None,:].dot(M) #dot mimics multiplication. Python wouldn't accept `*`

这有两个问题:

a)我不知道输出是什么。

b)我无法应用自定义功能。

有人可以帮我吗?我将不胜感激。

我对numpyscipy开放。


一些专家要求获得期望的输出。假设所需的输出为 [[48,3,4], [6,2,8], [8,6,8]]

但是,我希望您能为自定义2或更多列和2或更多行的解决方案提供一些指导。

1 个答案:

答案 0 :(得分:1)

您只需沿第0条轴滚动轴

np.roll(M, -1, axis=0)
# array([[6, 1, 2],
#        [1, 2, 4],
#        [8, 3, 2]])

并将结果与​​原始数组相乘

M * np.roll(M, -1, axis=0)
# array([[48,  3,  4],
#        [ 6,  2,  8],
#        [ 8,  6,  8]])

如果要合并两行以上,则可以滚动多次:

M * np.roll(M, -1, axis=0) * np.roll(M, -2, axis=0)
# array([[48,  6, 16],
#        [48,  6, 16],
#        [48,  6, 16]])