如何基于另一numpy数组的索引序列排序数组并保留nan位置不变
解决方案
实现代码
import numpy as np # 输入数组 array1 = np.array([np.nan,np.nan,np.nan,np.nan,2,np.nan,1,np.nan,np.nan,5,np.nan,np.nan,6,np.nan,10,9,np.nan]) array2 = np.array([np.nan,np.nan,np.nan,np.nan,45,np.nan,33,np.nan,np.nan,32,np.nan,np.nan,44,np.nan,10,53,np.nan]) # 1. 提取非nan位置掩码,两个数组nan位置完全一致,直接复用array1的掩码 valid_mask = ~np.isnan(array1) # 2. 按从左到右顺序获取所有非nan的索引位置,即需要填充的固定坑位 non_nan_pos = np.where(valid_mask)[0] # 3. 获取array1升序排序后的有效元素对应原索引(过滤掉末尾的nan对应的索引) sorted_valid_idx = np.argsort(array1)[:len(non_nan_pos)] # 4. 初始化结果数组,填充排序后的值 result = np.full_like(array2, np.nan) result[non_nan_pos] = array2[sorted_valid_idx] print(result)
步骤说明
- 核心逻辑是保留原数组的nan位置不变,只对非nan的有效位置做值的重映射
- 先通过掩码筛选出所有需要填充值的固定位置
- 用
np.argsort(array1)拿到的排序索引提取出对应有效元素的位置 - 将array2对应位置的值按顺序填充到固定的非nan坑位中即可
内容的提问来源于stack exchange,提问作者Nikolay Yasinskiy
相关产品推荐
相关产品推荐

