首页 > 解决方案 > 高效/优雅地将方法应用于对象的 numpy ndarray 或从中获取属性

问题描述

在一个python脚本中,有 2 个numpyndarrays 填充了对象,我们称它们为inAand inB(same shape)。这些对象都是相同的类型并且有一个方法calculate()和一个属性size

我想将该方法应用于每个元素,并将结果保存在一个新数组中,我还想从每个元素中获取属性并将结果保存在一个新数组中。

注意:我已经找到了实现所有这些的方法,但我认为它们可以改进。我只是不知道怎么做。

获取属性或应用不带参数的方法

如果该方法不接受参数或非数组参数,我找到了一种将其应用于每个元素的方法,如下所示:

f = lambda x: x.calculate()
outA = np.vectorize(f)(inA)

获得财产也是如此:

f = lambda x: x.size
outA = np.vectorize(f)(inA)

这是可行的,但它很难看(恕我直言),而且 IDE 不知道 lambda 函数的事实x使我不得不“盲目地”编写函数,而无需智能感知(或者它是 Spyder 等价物)的帮助。

方法的成对应用

如果该方法将另一个对象作为其参数,并且我想将其应用于每个元素inA并使用相应的元素inB作为其参数,那么我唯一能想到的就是一个可怕的循环:

out = np.ndarray(inA.shape)
for index, iA in np.ndenumerate(inA):
    out[index] = iA.calculate(inB[index])

我拒绝相信没有更好的方法来实现这一目标。

因此我的问题是:有没有办法改进将方法应用于 ndarray 中的元素或元素对的这两种方法(不是双关语) ?

标签: pythonnumpy

解决方案


对于应用一种方法,我发现我可以做到

outA = np.vectorize(className.calculate)(inA)

而对于一个方法的paiwise应用,我发现我可以做到

out = np.vectorize(className.calculate)(inA, inB)

因为方法的第一个参数是self.

特别是对于后者,这要干净得多。

我还没有找到一种方法来获取没有lambda函数的属性,我猜这个

outA = np.vectorize(lambda x: x.size)(inA)

是在 oneliner 中最简单/最好的方法。


推荐阅读