我有一个 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
但尚未成功。理想情况下,我希望返回包含第二个数组的值的所有行号,以便稍后删除这些行。
一,使用 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),)