【问题标题】:Masking a 3D NumPy array --> returns 5D array屏蔽 3D NumPy 数组 --> 返回 5D 数组
【发布时间】:2021-03-08 12:05:26
【问题描述】:

我有一个巨大的 3d NumPy 数组和一个相同形状的掩码数组,其中填充了 1 或 0。让我们以此为例:

arr = np.random.randint(1, 100, size=(4, 4, 4))
mask = np.zeros(shape=(4,4,4), dtype='int')
mask[0,2:3,:] = 1

我的目标是获得相同形状的数组(在本例中为 (4,4,4)),我们将其命名为 new_arr,其值来自 arr,其中 mask == 1new_arr 中的所有其他值都应该是 -2。 (不是0

但是,这样做:

new_arr = arr[mask]

产生 (4, 4, 4, 4, 4) 形状的阵列。

所以,我有 2 个问题:1:) 如何获得我想要的结果和 2.) 为什么以这种方式屏蔽 3d NumPy 数组会导致 5d 数组。

【问题讨论】:

    标签: arrays python-3.x numpy mask


    【解决方案1】:

    我相信你只需要 np.where:

    out = np.where(mask, arr, -2)
    

    回答你的其他问题

    1. 为什么以这种方式屏蔽 3d NumPy 数组会导致 5d 数组。

    这个想法是 mask 具有 dtype int。所以,arr[mask] 实际上是切片,而不是遮罩。因此mask 中的0 将导致arr[0],即(4,4)。然后对mask 中的所有值执行此操作,得到一个与mask 相同维度的数组,其每个值都是一个(4,4) 数组。

    修复代码的另一种方法是:

    out = np.full(arr.shape, -2)
    out[mask.astype(bool)] = arr[mask.astype(bool)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-30
      • 2011-08-11
      相关资源
      最近更新 更多