numpy 根据二维数组列中的值从三维数组中筛选出记录

67up9zun  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(188)

我有一个3D阵列的形状(3,5,5)如下所示。我想从索引为0的列为NaN的组成2D数组中筛选出所有记录(行)。
我在下面尝试过,但它返回的是2D数组,而不是所需的3D数组。

arr[ np.where(arr[:, :, 0] != np.nan)]

你能建议一下实现所述目标的正确方法吗?
谢谢!

[[[1. 0. 0.10. 0.]
  [2. 0. 0. 9. 0.]
  [nan. 0. 0. 8. 0.]
  [4. 0. 0. 7. 0.]
  [nan. 0. 0. 6. 0.]]
 [[1. 0. 0. 199. 0.]
  [2. 0. 0. 198. 0.]
  [3. 0. 0. 196. 0.]
  [nan. 0. 0. 190. 0.]
  [nan. 0. 0. 160. 0.]]
 [[1. 0. 0. 999. 0.]
  [2. 0. 0. 870. 0.]
  [nan. 0. 0. 270. 0.]
  [nan. 0. 0. 100. 0.]
  [nan. 0. 0. 80. 0.]]]
ryevplcw

ryevplcw1#

您可以尝试使用2D数组列表作为结果,因为经过na过滤后,内部的2D数组的形状将不同,因此它们不能堆叠在一起形成3D数组。

import numpy as np

arr = np.array([
 [[1., 0., 0., 10., 0.],
  [2., 0., 0., 9., 0.],
  [np.nan, 0., 0., 8., 0.],
  [4., 0., 0., 7., 0.],
  [np.nan, 0., 0., 6., 0.]],
 [[1., 0., 0., 199., 0.],
  [2., 0., 0., 198., 0.],
  [3., 0., 0., 196., 0.],
  [np.nan, 0., 0., 190., 0.],
  [np.nan, 0., 0., 160., 0.]],
 [[1., 0., 0., 999., 0.],
  [2., 0., 0., 870., 0.],
  [np.nan, 0., 0., 270., 0.],
  [np.nan, 0., 0., 100., 0.],
  [np.nan, 0., 0., 80., 0.]]],
)

row_masks = np.isnan(arr[:, :, 0])
result = [arr2d[~row_mask] for arr2d, row_mask in zip(arr, row_masks)]

结果:

[array([[ 1.,  0.,  0., 10.,  0.],
        [ 2.,  0.,  0.,  9.,  0.],
        [ 4.,  0.,  0.,  7.,  0.]])
 array([[  1.,   0.,   0., 199.,   0.],
        [  2.,   0.,   0., 198.,   0.],
        [  3.,   0.,   0., 196.,   0.]])
 array([[  1.,   0.,   0., 999.,   0.],
        [  2.,   0.,   0., 870.,   0.]])]

相关问题