基于NumPy/Python的简短模拟:含NaN数组的simu函数应用问题
解决方法:逐行应用自定义函数到NumPy数组
要把你的simu函数应用到NumPy数组的每一行,我们可以用NumPy的np.apply_along_axis函数实现逐行处理,同时还能优化原函数的NaN判断逻辑,让代码可读性更高。
步骤1:优化自定义函数
原函数通过np.sum(d)是否为NaN间接判断行内是否存在缺失值,我们可以直接检查行内的NaN情况,逻辑更直观:
import numpy as np def simu(d): # 直接检查当前行是否包含NaN值 if not np.isnan(d).any(): # 计算三个指定区间的均值(注意NumPy切片是左闭右开) a = d[1:4].mean() # 取索引1-3的元素求均值 b = d[3:6].mean() # 取索引3-5的元素求均值 c = d[6:9].mean() # 取索引6-8的元素求均值 res = [[a, b, c]] else: res = 'error' return res
步骤2:定义目标数组
data = np.array([[1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, np.nan, np.nan, np.nan], [4, 3, 5, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]])
步骤3:逐行应用函数
使用np.apply_along_axis,指定axis=1表示沿着行的方向处理(每一行作为参数传入simu函数):
results = np.apply_along_axis(simu, axis=1, arr=data) print(results)
最终输出
运行代码后会得到如下结果:
[[list([3.0, 5.0, 8.0])] ['error'] ['error']]
第一行无缺失值,成功计算出三个区间的均值;第二、三行包含NaN,因此返回error。
如果需要结果格式更统一(比如所有结果都返回数组类型),可以把else分支的返回值改成[[np.nan, np.nan, np.nan]],这样后续处理会更方便。
内容的提问来源于stack exchange,提问作者user9703788
相关产品推荐
相关产品推荐

