我是第一次使用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,因为a
和b
都包含[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进行正确的广播,然后沿着正确的轴使用any
和all
:
(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))
说明:
lambda
是创建函数的关键词。在这种情况下:
它表示采用lambda x: x in b
x
并返回x
是否在数组b
中的函数map
是一个内置函数,它将函数作为第一个参数,将可迭代函数作为第二个参数。它所做的是将第一个参数(函数(应用于iterable(第二个参数(中的每个项,并返回一个具有这些值的iterable。在这种情况下:
它返回CCD_ 18和CCD_map(lambda x: x in b, a)
- 最后,
any
是另一个内置函数,它接受并可迭代True
和False
的,如果可迭代项上的任何项是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)
它完全一样,甚至更清晰。