如何统计3D NumPy数组中各坐标分量的非NaN值计数?
问题描述
有N个尺寸均为M×3的2D NumPy数组,每个数组代表包含M个坐标的单个样本,部分坐标值为np.nan。已知通过堆叠数组并沿axis=0计算均值和标准差的代码:
averaged = np.nanmean(np.array(listOf2dArrays, dtype=np.float64), axis=0) std = np.nanstd( np.array(listOf2dArrays, dtype=np.float64), axis=0)
需要生成一个尺寸为M×3的2D数组,其中每个元素对应对应坐标分量的非NaN值计数(即计算均值和标准差时用到的有效样本数量)。
解决方案
可以利用np.isnan结合求和操作实现,步骤如下:
- 先将数组列表堆叠为3D数组(形状为
N×M×3),和之前计算均值/标准差的操作保持一致; - 通过
np.isnan标记所有NaN值,取反后得到非NaN值的布尔掩码; - 沿样本维度(
axis=0)对布尔掩码求和,即可得到每个坐标分量的非NaN值计数。
对应的代码:
# 堆叠为3D数组 stacked_arrays = np.array(listOf2dArrays, dtype=np.float64) # 计算每个坐标分量的非NaN值数量 counts = (~np.isnan(stacked_arrays)).sum(axis=0)
说明
np.isnan(stacked_arrays)会生成一个和输入形状相同的布尔数组,其中NaN值对应True,非NaN值对应False;~运算符对布尔数组取反,此时非NaN值对应True(求和时会被当作1计算);- 沿
axis=0求和,就是统计每个(M,3)位置上,N个样本中有多少个非NaN的有效数值,最终得到的counts数组尺寸为M×3,完全符合需求。
内容的提问来源于stack exchange,提问作者TheCat
相关产品推荐
相关产品推荐

