python - 高效/优雅地将方法应用于对象的 numpy ndarray 或从中获取属性
问题描述
在一个python
脚本中,有 2 个numpy
ndarrays 填充了对象,我们称它们为inA
and inB
(same shape
)。这些对象都是相同的类型并且有一个方法calculate()
和一个属性size
。
我想将该方法应用于每个元素,并将结果保存在一个新数组中,我还想从每个元素中获取属性并将结果保存在一个新数组中。
注意:我已经找到了实现所有这些的方法,但我认为它们可以改进。我只是不知道怎么做。
获取属性或应用不带参数的方法
如果该方法不接受参数或非数组参数,我找到了一种将其应用于每个元素的方法,如下所示:
f = lambda x: x.calculate()
outA = np.vectorize(f)(inA)
获得财产也是如此:
f = lambda x: x.size
outA = np.vectorize(f)(inA)
这是可行的,但它很难看(恕我直言),而且 IDE 不知道 lambda 函数的事实x
使我不得不“盲目地”编写函数,而无需智能感知(或者它是 Spyder 等价物)的帮助。
方法的成对应用
如果该方法将另一个对象作为其参数,并且我想将其应用于每个元素inA
并使用相应的元素inB
作为其参数,那么我唯一能想到的就是一个可怕的循环:
out = np.ndarray(inA.shape)
for index, iA in np.ndenumerate(inA):
out[index] = iA.calculate(inB[index])
我拒绝相信没有更好的方法来实现这一目标。
因此我的问题是:有没有办法改进将方法应用于 ndarray 中的元素或元素对的这两种方法(不是双关语) ?
解决方案
对于应用一种方法,我发现我可以做到
outA = np.vectorize(className.calculate)(inA)
而对于一个方法的paiwise应用,我发现我可以做到
out = np.vectorize(className.calculate)(inA, inB)
因为方法的第一个参数是self
.
特别是对于后者,这要干净得多。
我还没有找到一种方法来获取没有lambda
函数的属性,我猜这个
outA = np.vectorize(lambda x: x.size)(inA)
是在 oneliner 中最简单/最好的方法。
推荐阅读
- r - R包cem和MatchIt:不同的不平衡度量
- java - 处理(Drop and Log) Kafka producer 发布的不良数据,这样 Spark (Java) Consumer 不会将其存储在 HDFS 中
- node.js - 如何在multer中将cb错误转换为json格式
- c - 错误:构建 AV1 AOM 项目时将 R_X86_64_32 重新定位到“.rodata”
- java - 如何定位哪些库不兼容?尝试更新 Spring Boot 时出现问题
- swift - 如何快速创建一个不能为负的 int
- c - C中的递归 - 数组的最大元素
- python - ctypes._FuncPtr 接受哪个偏移量作为输入?
- python-3.x - Python设置突变:AttributeError:'set'对象没有属性'k'
- xamarin.forms - 如何在 Xamarin Forms 中保存会话存储?