【问题标题】:Apply custom function to 2 or more rows (or columns) in numpy将自定义函数应用于 numpy 中的 2 行或更多行(或列)
【发布时间】:2018-12-06 08:20:04
【问题描述】:

我对@9​​87654324@ 还很陌生,我想将自定义函数应用于 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 中,我假设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

[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) 我无法应用自定义函数。

有人可以帮帮我吗?如有任何帮助,我将不胜感激。

我对@9​​87654342@ 和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...您要我更改标题吗?如果是这样,如果您能提出一些建议,我将不胜感激。我不确定。

标签: python arrays numpy scipy


【解决方案1】:

您可以简单地沿着0th 轴滚动您的轴

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

【讨论】:

  • 谢谢。有没有办法使用自定义函数?
  • 这在很大程度上取决于您的自定义函数的作用。
  • 谢谢。它会总是接受两个相同维度的一维 numpy 数组并返回一维 numpy 数组。我相信我已经在问题中澄清了这一点。
  • 那么没有。它需要接受二维数组。但在很多情况下,可以让接受一维数组的函数接受二维数组。
  • 因为两个数组都是二维的。您可以逐行迭代它,但这会使事情变慢。只需使用您的实际功能打开一个新问题,然后询问如何将其矢量化为 2D 操作。
猜你喜欢
  • 2022-11-08
  • 2021-05-18
  • 2019-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 2018-12-20
相关资源
最近更新 更多