在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])
我拒绝相信没有更好的方法来实现这一目标。
因此,我的问题是:是否可以对这两种方法进行改进(无双关语)将方法应用于ndarray中的元素或元素对?
答案 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
是在单线飞机上执行此操作的最简单/最佳方法。