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

时间:2019-05-15 19:53:33

标签: python numpy

python脚本中,有2个numpy ndarray填充了对象,我们将它们称为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),而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])

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

因此,我的问题是:是否可以对这两种方法进行改进(无双关语)将方法应用于ndarray中的元素或元素对?

1 个答案:

答案 0 :(得分:0)

我发现我可以做到

import numpy as np
A=np.array([[4,5,6],
    [0,7,8],
    [0,9,0]])

B =np.array([[11,12,13],
      [14,15,16],
      [17,18,19]])
C = B.copy()
B[A == 0] = 0
C, B = B, C

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

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

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

特别是对于后者,这很多清洁器。

我没有找到一种没有self函数的ge属性的方法,我想这是

lambda

是在单线飞机上执行此操作的最简单/最佳方法。