如何在NumPy中基于非NaN值合并两个数组得到目标数组
在NumPy中基于非NaN值合并两个数组的方法
需求是将形状为(r, c)的数组1(含NaN和非NaN值)与形状为(r, 2)的数组2合并,把数组2的每行值替换到数组1对应行的非NaN位置,得到同形状的结果数组。
实现思路
- 定位数组1中所有非NaN元素的位置索引;
- 复制数组1作为结果的基础;
- 将数组2的展平值按索引替换到结果数组的对应位置。
代码示例
import numpy as np # 模拟输入数组 arr1 = np.array([ [np.nan, 1., 1., np.nan, np.nan, np.nan], [np.nan, np.nan, np.nan, 1., 1., np.nan], [np.nan, np.nan, 1., 1., np.nan, np.nan], [np.nan, np.nan, np.nan, 1., 1., np.nan], [np.nan, np.nan, np.nan, 1., 1., np.nan], [np.nan, np.nan, 1., 1., np.nan, np.nan] ]) arr2 = np.array([ [0.76620125, 59.14934823], [2.52819832, 43.63809538], [1.9656387 , 25.62212163], [2.55076928, 43.04276273], [2.62058763, 22.14260189], [1.8050997 , 51.72144285] ]) # 获取所有非NaN元素的行、列索引 row_indices, col_indices = np.where(~np.isnan(arr1)) # 初始化结果数组 result = arr1.copy() # 将数组2的值替换到对应非NaN位置 result[row_indices, col_indices] = arr2.flatten() # 输出结果 print(result)
代码说明
np.where(~np.isnan(arr1)):返回两组索引,分别对应数组1中非NaN元素的行号和列号,实现精准定位;arr2.flatten():将二维的数组2转为一维,刚好匹配数组1中非NaN元素的总数量(每行2个,共r*2个);- 直接赋值操作会按顺序将数组2的元素填充到数组1的非NaN位置,得到目标结果。
该方法同样适用于数组1每行非NaN数量固定、且与数组2列数一致的其他场景。
内容的提问来源于stack exchange,提问作者a_b
相关产品推荐
相关产品推荐

