如何使用NumPy内置功能合并矩阵列,取每行首个非nan值
可以直接通过NumPy内置函数实现,核心逻辑是逐行定位第一个非nan值的位置,再按索引取值后转换为单列矩阵即可,实现代码如下:
import numpy as np # 你的输入矩阵,此处用示例矩阵演示 arr = np.array([[np.nan, np.nan], [np.nan, np.nan], ['value 1', np.nan], [np.nan, np.nan], [np.nan, np.nan], [np.nan, 'value 2']], dtype=object) # 1. 生成非nan值的布尔掩码,兼容混合字符串、数值的object类型数组 not_nan_mask = np.vectorize(lambda x: not np.isnan(x) if isinstance(x, float) else True)(arr) # 2. 取每行第一个非nan值的索引,全nan行默认返回索引0(对应值仍为nan) first_col_idx = np.argmax(not_nan_mask, axis=1) # 3. 按索引取值并转为单列矩阵 res = arr[np.arange(arr.shape[0]), first_col_idx, None]
输出的res就是你需要的结果:
array([[nan], [nan], ['value 1'], [nan], [nan], ['value 2']], dtype=object)
规则适配说明
- 单行存在多个非nan值时,
np.argmax会返回第一个非nan值的位置,符合优先取第一个的要求 - 整行全为nan时,返回的结果对应位置仍为nan
- 兼容字符串、浮点型、整型混合存储的object类型矩阵
内容的提问来源于stack exchange,提问作者ljuk
相关产品推荐
相关产品推荐

