NumPy检查2D阵列是否是2D阵列的子集

时间:2016-05-16 19:25:18

标签: python arrays python-2.7 numpy

我想检查数组b是否是数组a的子集。通过子集我的意思是我想检查b中是否找到a的所有元素。

这是我的代码:

import numpy as np
a = np.array([[1,7,9],[8,3,12],[101,-74,0.5]])
b = np.array([[1,9],[8,12],[101,0.5]])
print a
print b

这是输出

数组a

[[   1.     7.     9. ]
 [   8.     3.    12. ]
 [ 101.   -74.     0.5]]

数组b

[[   1.     9. ]
 [   8.    12. ]
 [ 101.     0.5]]

有没有办法检查b是否是?

的子集

编辑:附加信息:

根据下面的评论,我应该澄清一下,我需要知道数组b是否是数组a的子集 - 如果子集中缺少一个元素,那么我正在寻找一种方法来检查这一点。我不需要指示元素丢失的子集中的哪个位置,只是知道它丢失了。如果可以提供有关缺失元素的其他信息,那么这将是一个奖励,但这不是一个硬性要求。抱歉不早点清除它。

我将这个问题作为一个子集来表达的理由是,如果一个数组是另一个数组的子集,那么这就意味着子集数组的所有值都存在于更大的数组中。

4 个答案:

答案 0 :(得分:3)

我想你想numpy.in1d,就像这样:

import numpy as np
a = np.array([[1,7,9],[8,3,12],[101,-74,0.5]])
b = np.array([[1,9],[8,12],[101,0.5]])

np.in1d(b.ravel(), a.ravel()).all()

答案 1 :(得分:2)

如果你想比较,一种方法是先将它们分组:

a = np.array([[1,7,9],[8,3,12],[101,-74,0.5]])
b = np.array([[1,9],[8,12],[101,0.5]])
c = np.array([[1,9],[8,12],[101,-74.]])

def bycols(arr):
    tr=arr.T.copy()
    type=np.dtype((np.void,tr.strides[0]))
    return tr.view(type).squeeze()

A,B,C=[bycols(x) for x in (a,b,c)]    

然后A,B,C只是表示列的字节数组:

In [5]: [x.shape for x in (A,B,C)]
Out[5]: [(3,), (2,), (2,)]

您现在可以使用np.in1d测试所属:

In [6]: np.in1d(C,A)
Out[6]: array([ True, False], dtype=bool)

In [7]: np.in1d(B,A)
Out[7]: array([ True,  True], dtype=bool)

但是:

In [8]: np.in1d(c,a)
Out[8]: array([ True,  True,  True,  True,  True,  True], dtype=bool)

因为np1d适用于扁平数组。

答案 2 :(得分:1)

这应该有效:

set(np.unique(b)).issubset(set(np.unique(a)))

编辑:上面的代码返回TrueFalse,而不是布尔列向量。从@Eelco Hoogendoorn对您的问题的评论,我了解到您确实对检查b是否是{的相应的子集感兴趣{1}},对吗?假设这是正确的问题描述,下面的单行应该可以工作:

a

上面的代码简单易读,不需要第三方依赖。这无疑是一个快速而肮脏的解决方案,因为正如@Bi Rico正确指出的那样,这种方法效率非常低。如果你需要处理大型数组,你应该坚持使用矢量化算法。

答案 3 :(得分:1)

如果我正确地读了你的问题(测试a和b中的每一个对应的行,如果b中的行是a中行的一个子集),这应该有效且正确地执行:

{{1}}

您需要安装numpy_indexed包(免责声明:我是其作者)