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,)形状),您甚至可以得到笛卡尔应用程序。