基于numpy现有数组计算生成新数组:np.fromfunction写法正确性及无循环方案
问题1:你编写的np.fromfunction实现是否正确
你的实现是正确的,输出结果和初始for循环版本完全匹配,逻辑也和需求对齐:
- 对每一对行索引x、y,计算两行对应元素差的绝对值的
nanmean - 增加了nan判断,结果异常时返回0
- 加了0.001的偏移避免除零错误
不过要注意:np.vectorize本质只是语法包装,内部还是逐元素迭代执行,没有真正实现向量化加速,性能和你手写显式for循环没有本质差异。
问题2:其他无循环numpy实现方案
存在纯numpy原生向量化的无循环实现,核心利用numpy的广播机制扩展维度批量计算,性能远高于循环和np.vectorize写法,代码如下:
import numpy as np s = np.array([[ 5., 4., np.nan, 1., np.nan], [np.nan, 4., 4., 2., 2.], [ 3., np.nan, np.nan, 5., 5.], [np.nan, 3., 4., 4., np.nan]]) # 广播计算所有行对的绝对差,输出形状为 (n_rows, n_rows, n_cols) abs_diff = np.abs(s[:, np.newaxis] - s) # 沿最后一个轴(列维度)计算忽略nan的均值,输出形状为 (n_rows, n_rows) mean_diff = np.nanmean(abs_diff, axis=2) # 计算权重,同时处理可能的nan值 s1 = np.nan_to_num(1 / (mean_diff + 0.001), nan=0)
该代码输出和你原有两个版本的结果完全一致,且所有运算都在numpy底层C层面执行,没有Python层面的循环,当数组行数较多时性能优势会非常明显。
内容的提问来源于stack exchange,提问作者robocon20x
相关产品推荐
相关产品推荐

