我想创建 numpy 数组的掩码,标记包含另一个数组中的值的任何行

问题描述 投票:0回答:1

我有一个 numpy 数组:

247 656 6363
13822   13818   30054
10174   25484   6553
6107    2927    6578
2904    6462    3941
16562   8692    16563
25182   6681    25181
6679    6429    3841

我想标记此数组中任意 3 列包含第二个数组中的数字的所有行:

13822
13818
2927
8692
3841

这可能吗?

我希望结果提供数组 1 中包含这些值之一的所有行的列表或数组。

我四处搜寻并尝试使用

numpy.mask
但尚未成功。理想情况下,我希望返回包含第二个数组的值的所有行号,以便稍后删除这些行。

python numpy mask
1个回答
0
投票

一,使用 3d 比较数组。

一对示例数组:

In [184]: first = np.arange(15).reshape(5,3); second = np.array([4,3,1,13])

In [185]: first, second
Out[185]: 
(array([[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11],
        [12, 13, 14]]),
 array([ 4,  3,  1, 13]))

使用numpy广播比较2,结果是3d:

In [186]: first[:,:,None]==second
Out[186]: 
array([[[False, False, False, False],
        [False, False,  True, False],
        [False, False, False, False]],

       [[False,  True, False, False],
        [ True, False, False, False],
        [False, False, False, False]],

       [[False, False, False, False],
        [False, False, False, False],
        [False, False, False, False]],

       [[False, False, False, False],
        [False, False, False, False],
        [False, False, False, False]],

       [[False, False, False, False],
        [False, False, False,  True],
        [False, False, False, False]]])

现在检查所需的 True 组合。对于

first
的所有行至少有一个 True:

In [187]: (first[:,:,None]==second).any(axis=1)
Out[187]: 
array([[False, False,  True, False],
       [ True,  True, False, False],
       [False, False, False, False],
       [False, False, False, False],
       [False, False, False,  True]])

测试

first
second
(轴 2)的最后一行:

In [188]: (first[:,:,None]==second).any(axis=(1,2))
Out[188]: array([ True,  True, False, False,  True])

和行索引:

In [189]: np.nonzero(_)
Out[189]: (array([0, 1, 4], dtype=int64),)
© www.soinside.com 2019 - 2024. All rights reserved.