You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

一维数组的np.where替代方案:填充NaN遇结果异常问题

解决用另一数组填充一维数组NaN值时的列表推导式截断问题

这个问题我之前也碰到过!核心原因是你用的zip()函数会以最短的输入序列长度来终止迭代——你的replace只有2个元素,而sample和np.isnan(sample)都有7个元素,所以zip只生成了2组元素,导致最终的new_sample只得到前2个值。

下面给你两种靠谱的解决方案:

方法一:用Numpy布尔索引直接填充(推荐)

把sample转成Numpy数组后,可以直接通过布尔索引定位所有NaN的位置,然后一次性替换,代码简洁又高效:

import numpy as np

sample = np.array([1, 2, np.nan, 4, 5, 6, np.nan])
replace = np.array([3, 7])

# 找到所有NaN的位置
nan_positions = np.isnan(sample)
# 把replace的值对应填充到NaN位置
sample[nan_positions] = replace

print(sample.tolist())  # 输出: [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0]

这种方式不需要手动遍历,Numpy会自动处理位置匹配,尤其适合数据量较大的场景。

方法二:用迭代器实现纯列表推导式

如果不想转Numpy数组,可以把replace转换成迭代器,遍历sample时遇到NaN就取迭代器的下一个值:

import numpy as np

sample = [1, 2, np.nan, 4, 5, 6, np.nan]
replace_iter = iter([3, 7])

new_sample = [next(replace_iter) if np.isnan(x) else x for x in sample]
print(new_sample)  # 输出: [1, 2, 3, 4, 5, 6, 7]

这里iter()把replace变成一个可逐个取值的迭代器,next()每次调用都会取出下一个元素,完美匹配所有NaN的位置,不会出现截断问题。

内容的提问来源于stack exchange,提问作者An economist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:07:33