高效/优雅地将方法应用于大量对象或从中获取属性

2024-04-20 04:19:37 发布

您现在位置:Python中文网/ 问答频道 /正文

python脚本中,用对象填充2个numpy数组,我们称它们为inAinB(相同的shape)。这些对象都是相同的类型,并且有一个方法calculate()和一个属性size。你知道吗

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

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

无参数获取属性或应用方法

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

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

获得财产也是如此:

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

这是可行的,但是很难看(imho),而且IDE不知道lambda函数中的x这一事实使得我不得不“盲目地”编写函数,而没有intellisense的帮助(或者它的Spyder等价物)。你知道吗

方法的成对应用

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

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

我拒绝相信没有更好的方法来实现这一点。你知道吗

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


Tags: 对象方法lambda元素参数sizeindex属性
1条回答
网友
1楼 · 发布于 2024-04-20 04:19:37

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

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

对于paiwise方法的应用,我发现我可以

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

因为方法的第一个参数是self。你知道吗

尤其是对于后者,这是很多清洁。你知道吗

我还没有找到一种没有lambda函数的方法,我猜

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

是最简单/最好的一种方式。你知道吗

相关问题 更多 >