我对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
中,我假设a
和b
分别是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后尝试了几种方法:
vf=np.vectorize(myf)
vf(M,M)
但是,以上函数将自定义函数按元素而不是按行或按列应用。
我也尝试过:
M[:,None,:].dot(M) #dot mimics multiplication. Python wouldn't accept `*`
这有两个问题:
a)我不知道输出是什么。
b)我无法应用自定义功能。
有人可以帮我吗?我将不胜感激。
我对numpy
和scipy
开放。
一些专家要求获得期望的输出。假设所需的输出为
[[48,3,4],
[6,2,8],
[8,6,8]]
。
但是,我希望您能为自定义2或更多列和2或更多行的解决方案提供一些指导。
答案 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]])