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

Python 高效/优雅地将方法应用于大量对象或从中获取属性,python,numpy,Python,Numpy,在python脚本中,让2个numpyndarray填充对象,让我们将它们称为inA和inB(相同的shape)。这些对象都是相同类型的,并且具有方法calculate()和属性size 我想对每个元素应用该方法,并将结果保存在一个新数组中,我还想从每个元素获取属性,并将结果保存在一个新数组中。 注意:我已经找到了实现所有这些的方法,但我认为它们可以改进。我只是不知道怎么做 获取属性或应用不带参数的方法 如果该方法不接受参数或非数组参数,我找到了一种方法将其应用于每个元素,如下所示: f = l

python
脚本中,让2个
numpy
ndarray填充对象,让我们将它们称为
inA
inB
(相同的
shape
)。这些对象都是相同类型的,并且具有方法
calculate()
和属性
size

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

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

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

f = lambda x: x.calculate()
outA = np.vectorize(f)(inA)
获取属性也是如此:

f = lambda x: x.size
outA = np.vectorize(f)(inA)
这是可行的,但它很难看(imho),而且lambda函数中的
x
对于IDE来说是未知的,这使得我不得不“盲目地”编写函数,而无需intellisense(或其Spyder等价物)的帮助

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

out = np.ndarray(inA.shape)
for index, iA in np.ndenumerate(inA):
    out[index] = iA.calculate(inB[index])
我拒绝相信没有更好的方法来实现这一点


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

outA = np.vectorize(className.calculate)(inA)
对于方法的成对应用,我发现我可以

out = np.vectorize(className.calculate)(inA, inB)
因为方法的第一个参数是
self

尤其是对于后者,这更干净

我还没有找到一种没有
lambda
函数的方法来更新属性,我猜是这样的

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

在一行程序中是最简单/最好的方法。

只是不要使用对象数组,使用普通的Python
list
,这将是更好的方法。我使用
np.frompyfunc
以同样的方式创建和访问对象元素<代码>np。矢量化使用它,但开销更大。它返回一个对象数组。对象数据类型数组包含指向对象的指针,很像列表。大多数快速编译numpy方法都不适用。
np.frompyfunc(lambda x,y:x.calculate(y),2,1)(inA,inB)
可能适用于成对编译。如果
inA
inB
适当地广播(一个是(n,1)另一个是(m,)形状),您甚至可以得到笛卡尔应用程序。