我想检查数组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的子集 - 如果子集中缺少一个元素,那么我正在寻找一种方法来检查这一点。我不需要指示元素丢失的子集中的哪个位置,只是知道它丢失了。如果可以提供有关缺失元素的其他信息,那么这将是一个奖励,但这不是一个硬性要求。抱歉不早点清除它。
我将这个问题作为一个子集来表达的理由是,如果一个数组是另一个数组的子集,那么这就意味着子集数组的所有值都存在于更大的数组中。
答案 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)))
编辑:上面的代码返回True
或False
,而不是布尔列向量。从@Eelco Hoogendoorn对您的问题的评论,我了解到您确实对检查b
的行是否是{的相应行的子集感兴趣{1}},对吗?假设这是正确的问题描述,下面的单行应该可以工作:
a
上面的代码简单易读,不需要第三方依赖。这无疑是一个快速而肮脏的解决方案,因为正如@Bi Rico正确指出的那样,这种方法效率非常低。如果你需要处理大型数组,你应该坚持使用矢量化算法。
答案 3 :(得分:1)