繁体   English   中英

2D Numpy蒙版无法按预期工作

[英]2d numpy mask not working as expected

我试图通过删除选择索引将2x3的numpy数组变成2x2的数组。

我想我可以使用具有true / false值的mask数组来做到这一点。

特定

 [ 1,  2,  3],
 [ 4,  1,  6]

我想从每一行中删除一个元素给我:

 [ 2,  3],
 [ 4,  6]

但是,此方法无法正常工作:

import numpy as np

in_array = np.array([
 [ 1,  2,  3],
 [ 4,  1,  6]
])

mask = np.array([
 [False,  True,  True],
 [True,   False, True]
])

print in_array[mask]

给我:

[2 3 4 6]

这不是我想要的。 有任何想法吗?

唯一“错误”的是形状-1d而不是2。但是如果您的口罩是

mask = np.array([
 [False,  True,  False],
 [True,   False, True]
])

第一行中有1个值,第二行中有2个值。 它不能以二维数组的形式返回它,可以吗?

因此,像这样进行遮罩时的默认行为是返回1d或混乱的结果。

这样的布尔索引实际上是where索引:

In [19]: np.where(mask)
Out[19]: (array([0, 0, 1, 1], dtype=int32), array([1, 2, 0, 2], dtype=int32))
In [20]: in_array[_]
Out[20]: array([2, 3, 4, 6])

它找到掩码为true的元素,然后选择in_array的相应元素。

也许where的转置更容易可视化:

In [21]: np.argwhere(mask)
Out[21]: 
array([[0, 1],
       [0, 2],
       [1, 0],
       [1, 2]], dtype=int32)

并迭代索引:

In [23]: for ij in np.argwhere(mask):
    ...:     print(in_array[tuple(ij)])
    ...:     
2
3
4
6

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM