首页 > 解决方案 > 在 numpy 数组中查找所有 NaN 切片

问题描述

我有一个四维 Numpy ndarray(时间、压力水平、纬度、经度),如果沿纬度或经度维度存在全 NaN 切片,我想检查每个时间和压力水平(维度 0 和 1)( 2 和 3)。我想以矢量化的方式来处理它,所以不用遍历数组,但我不知道怎么做。

import numpy as np
a=np.ones([2,3,5,5])
a[0,2,:,2]=np.nan*np.ones_like(a[0,2,:,2])
a[0,1,1,:]=np.nan*np.ones_like(a[0,1,1,:])
a[0,0,1,2]=np.nan
a[1,1,:,2]=np.nan*np.ones_like(a[0,2,:,2])
a[1,1,1,:]=np.nan*np.ones_like(a[0,1,1,:])
print(a)

该数组现在包含一个(即数字),并且在某些位置只有NaNs 的切片。我想知道这些位置。所以在这种情况下,我需要找到NaN切片在 [0,2,:,2]、[0,1,1,:]、[1,1,:,2] 和 a[1,1 ,1,:]。

标签: pythonnumpyindexingnan

解决方案


您应该使用np.isnan创建与原始矩阵大小相同的布尔矩阵的函数。然后只需使用布尔归约操作,如np.all. 因此,以下代码在idx中存储所有元素都等于 的行的索引(axis=1)np.nan

arr = np.array([[0, 0, 0], [np.nan, np.nan, np.nan], [1, np.nan, 1]])
arr_isnan = np.isnan(arr)
idx = np.argwhere(arr_isnan.all(axis=1))

输出:

>>>print(idx)
[[1]]

按照您的示例,此方法为您提供以下输出:

arr_isnan = np.isnan(a)
idx = np.argwhere(arr_isnan.all(axis=2))

>>>print(idx) #[0,2,:,2] and [1,1,:,2] because axis=2
array([[0, 2, 2],
       [1, 1, 2]], dtype=int64)

>>>print(a[idx[:,0], idx[:,1], :, idx[:,2]])
[[nan nan nan nan nan]
 [nan nan nan nan nan]]

所以你只需要根据轴调整“:”的位置。


推荐阅读