如何对np.array对象数组的每个元素调用相同方法?有无更优雅实现
结论
原生NumPy没有专门用于批量调用数组内对象方法的内置API,但有以下几种比裸写for循环更简洁的实现方式,语法层面更优雅,性能和手动循环完全一致:
实现方式
1. 使用np.vectorize语法糖(最贴近你要的numpy风格调用)
np.vectorize可以将逐元素操作包装成批量调用的形式,一行即可完成操作:
import numpy as np # 批量调用grid方法 np.vectorize(lambda x: x.grid())(ax)
2. 列表推导(最通用,无需额外依赖)
纯Python语法,不需要调用numpy的额外方法,写法简洁:
[axi.grid() for axi in ax]
注:该写法会生成一个元素全为
None的临时列表,如果你对内存占用极度敏感,可以改用生成器表达式配合any消费:any(axi.grid() for axi in ax),不过一般绘图场景下完全不需要做这个优化。
3. 适配Matplotlib场景的特殊写法
如果你只是批量处理Matplotlib的axes对象,可以直接通过画布对象的fig.axes属性拿到所有子图的axes实例,不管你创建的subplots是多少维数组,都不需要额外做reshape操作:
[axi.grid() for axi in fig.axes]
补充说明
所有以上写法底层都还是基于循环实现,因为NumPy的向量化优化仅针对数值运算,无法对任意Python对象的自定义方法做SIMD级别的加速,因此和你原来写的for循环性能没有差异,仅做了语法层面的简化。
内容的提问来源于stack exchange,提问作者l_MP_l
相关产品推荐
相关产品推荐

