如何将列表元素按顺序替换numpy数组中非np.nan的元素
实现方案
直接使用numpy的布尔索引做向量化赋值即可,全程无显式循环,适配任意维度的数组和动态长度的匹配序列:
首先导入numpy并准备原始数据:
import numpy as np a = [1, 2, 3, 4, 5] b = np.array([[np.nan, 10, np.nan], [11, 12, 13], [np.nan, 14, np.nan]])
核心实现代码:
# 复制原数组避免修改原始数据,不需要保留原数组可直接操作b c = b.copy() # 给所有非nan位置按行优先顺序赋值a的元素 c[~np.isnan(c)] = a
执行后c的输出结果与需求完全一致:
array([[nan, 1., nan], [ 2., 3., 4.], [nan, 5., nan]])
原理解释
~np.isnan(c)会生成和c形状一致的布尔掩码,非nan位置为True,nan位置为False- numpy对布尔索引的赋值默认按**行优先(C风格顺序)**匹配右侧序列的元素,正好符合按顺序填充非nan位置的要求
- 该方案为纯向量化操作,性能远高于循环写法,只要保证a的长度和b中非nan元素数量一致,无论b的维度、a的长度如何变化都可以直接使用。
内容的提问来源于stack exchange,提问作者Ray Li
相关产品推荐
相关产品推荐

