【发布时间】:2018-12-06 08:20:04
【问题描述】:
我对@987654324@ 还很陌生,我想将自定义函数应用于 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]])
现在,我想计算所有三行组合的乘积。为此,我创建了一个 custom 函数。该函数的实际操作可能与乘法不同。乘法只是一个例子。
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
或
[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) 我无法应用自定义函数。
有人可以帮帮我吗?如有任何帮助,我将不胜感激。
我对@987654342@ 和scipy 持开放态度。
一些专家要求得到所需的输出。让我们假设所需的输出是
[[48,3,4],
[6,2,8],
[8,6,8]].
但是,我希望能提供一些有关为 2 列或更多列和 2 列或更多行自定义解决方案的指导。
【问题讨论】:
-
期望的输出是什么?
-
在您的示例中,您将函数“滚动”在(包装的)
numpy数组上,而不是标题似乎表明的内容:在多个(但特定的)行上应用一些多元函数。这实际上使事情变得更加复杂 -
@Nils Werner。谢谢。我们可以将自定义函数应用于行吗?
[[48,3,4], [6,2,8], [8,6,8]]另外,如果该解决方案可定制为 2 列或更多列和 2 列或更多行,我将不胜感激。 -
也许您正在寻找
ufunc? -
@ZizisNot...您要我更改标题吗?如果是这样,如果您能提出一些建议,我将不胜感激。我不确定。