如何获取二维Numpy数组每行的最后一个非空值?
提取二维NumPy数组每行最后一个非NaN值的实现方法
这里提供两种实用的实现方式,针对你的数组需求可以直接套用:
方法一:利用NumPy向量化操作(高效处理大数组)
通过布尔索引和反向查找定位每行最后一个非NaN值的位置,再提取对应元素:
import numpy as np a = np.array( [ [1,2,np.nan,np.nan], [1,33,45,np.nan], [11,22,3,78], ] ) # 生成标记非NaN元素的布尔矩阵 non_nan_mask = ~np.isnan(a) # 反转每行的布尔序列,用argmax找到第一个True的位置(对应原数组最后一个非NaN的位置) last_idx = non_nan_mask.shape[1] - 1 - np.argmax(non_nan_mask[:, ::-1], axis=1) # 根据行索引和元素位置提取结果 result = a[np.arange(a.shape[0]), last_idx] print(result) # 输出:[ 2. 45. 78.]
注意:如果存在全为NaN的行,argmax会返回0,导致提取最后一个位置的NaN,可根据需求添加判断逻辑处理这种情况。
方法二:自定义函数结合apply_along_axis(逻辑直观)
通过自定义函数过滤每行的NaN值,直接取最后一个有效元素:
import numpy as np a = np.array( [ [1,2,np.nan,np.nan], [1,33,45,np.nan], [11,22,3,78], ] ) def extract_last_non_nan(row): # 过滤当前行的NaN值 valid_vals = row[~np.isnan(row)] # 返回最后一个有效元素,全NaN时返回NaN(可根据需求修改) return valid_vals[-1] if len(valid_vals) > 0 else np.nan # 沿行方向应用自定义函数 result = np.apply_along_axis(extract_last_non_nan, axis=1, arr=a) print(result) # 输出:[ 2. 45. 78.]
内容的提问来源于stack exchange,提问作者vvv
相关产品推荐
相关产品推荐

