检查numpy数组中的任何行是否是另一个数组的一部分



我是第一次使用numpy。我正在努力实现以下目标:

有2个阵列:

a = np.array([[1, 3], [2, 5], [1, 2], [2, 1], [1,6]])
b = np.array([[3, 5], [1, 2]])

我需要检查阵列b中的ANY对(换句话说,一行(是否以相同的顺序出现在阵列a中(如中所示,[1, 2]不应被视为与[2, 1]相同(

上面的例子应该返回True,因为ab都包含[1, 2]

我试过:

for [x, y] in b
if [x, y] in a

和:

if (a == b).all(1).any() # --> This throws "AttributeError: 'bool' object has no attribute 'all'"

但失败了。

提前感谢

让我们用numpyic的方式来做(循环不建议使用numpy(。使用None添加一个维度,让numpy进行正确的广播,然后沿着正确的轴使用anyall

(a==b[:,None]).all(-1).any()

有问题的样本输入的输出:

True

此解决方案使用np.ravel_multi_index来避免广播。如果你的阵列很大,这很有帮助,因为它不使用广播

d = np.maximum(a.max(0), b.max(0))+1
np.in1d(np.ravel_multi_index(a.T,d), np.ravel_multi_index(b.T,d)).any()
Out[71]: True

该解决方案还能够给出a中与匹配的行的位置

np.nonzero(np.in1d(np.ravel_multi_index(a.T,d), np.ravel_multi_index(b.T,d)))[0]
Out[72]: array([2], dtype=int64)

注意:我很久以前从@Divakar那里学到了这个技巧。所以,功劳应该归于他。

尝试:

a = np.array([[1, 3], [2, 5], [1, 2], [2, 1], [1,6]])
b = np.array([[3, 5], [1, 2]])
check = any(map(lambda x: x in b, a))

说明:

  1. lambda是创建函数的关键词。在这种情况下:
    lambda x: x in b
    
    它表示采用x并返回x是否在数组b中的函数
  2. map是一个内置函数,它将函数作为第一个参数,将可迭代函数作为第二个参数。它所做的是将第一个参数(函数(应用于iterable(第二个参数(中的每个项,并返回一个具有这些值的iterable。在这种情况下:
    map(lambda x: x in b, a)
    
    它返回CCD_ 18和CCD_
  3. 最后,any是另一个内置函数,它接受并可迭代TrueFalse的,如果可迭代项上的任何项是True,则返回True

编辑:

你也可以使用列表理解(就像有人在评论中写下的那样(:

a = np.array([[1, 3], [2, 5], [1, 2], [2, 1], [1,6]])
b = np.array([[3, 5], [1, 2]])
check = any(x in b for x in a)

它完全一样,甚至更清晰。

相关内容

最新更新