根据2D numpy数组过滤3D numpy数组

时间:2017-11-21 08:29:24

标签: python arrays numpy 3d

我有一个2D numpy数组,其形状为(3024,4032)。

我有一个3D numpy数组,其形状为(3024,4032,3)。

2D numpy数组填充0和1。

3D numpy数组填充0到255之间的值。

通过查看2D数组值,我想更改3D数组中的值。如果2D数组中的值为0,我将沿着最后一个轴将3D数组中的所有3个像素值更改为0。如果2D数组中的值为1,我将不会更改它。

我已经检查了这个问题,How to filter a numpy array with another array's values,但它适用于2个具有相同尺寸的数组。就我而言,尺寸不同。

如何在两个数组中应用过滤,在2个维度上具有相同的大小,但在最后一个维度上没有大小?

2 个答案:

答案 0 :(得分:2)

好的,我会回答这个问题,以突出一个关于"缺失"尺寸。让'假设a.shape==(5,4,3)b.shape==(5,4)

索引时,现有维度对齐,这就是@Divakar的解决方案a[b == 0] = 0有效的原因。

广播时,现有尺寸正确对齐,这就是为什么@ InvaderZim a*b不起作用的原因。您需要做的是a*b[..., None],它在右侧插入可广播的维度

答案 1 :(得分:1)

我认为这个很简单:

如果a是填充了值的3D数组(a.shape ==(5,4,3)),b是填充了1和0的2D数组(b.shape ==(5,4)) ,然后重塑b并乘以它们:

a = a * b.reshape(5, 4, 1)

Numpy会根据需要自动扩展数组。