如何有效地过滤numpy数组,使其包含第二个数组中包含的行

如何有效地过滤numpy数组,使其包含第二个数组中包含的行,numpy,filter,compare,Numpy,Filter,Compare,事实上,a有十万行b是一个固定大小 a = array([[0, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 1, 0, 0, 1], [1, 1, 0, 0, 0], [1, 1, 0, 0, 0], [0, 0, 0, 0, 0]]) b = array([[0, 0, 0, 0, 0], [0, 0, 0, 1, 1], [0, 0, 1, 1, 1],

事实上,a有十万行b是一个固定大小

a = array([[0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0],
       [1, 1, 0, 0, 1],
       [1, 1, 0, 0, 0],
       [1, 1, 0, 0, 0],
       [0, 0, 0, 0, 0]])

b = array([[0, 0, 0, 0, 0],
       [0, 0, 0, 1, 1],
       [0, 0, 1, 1, 1],
       [0, 1, 1, 1, 1],
       [1, 0, 0, 0, 0],
       [1, 1, 0, 0, 0],
       [1, 1, 1, 0, 0],
       [1, 1, 1, 1, 1]])
我正在这样做:

matches=[]
for n, a_row in enumerate(a):
    for b_row in b:
        if np.all(a_row ==b_row ):
            matches.append(n)

a[matches]
似乎应该有更好的方法…

您可以在这里非常有效地使用。它会将任何具有八列或更少列的数组转换为一列
uint8

ai = np.packbits(a, axis=-1)
bi = np.packbits(a, axis=-1)
对于最多64列的任意数量的列,可以使用适当的整数类型:

您可以简单地将阵列与(或)进行比较:

您现在可以像以前一样直接为
a
编制索引:

a[mask, :]
您的原始示例将变成一行:

a[np.in1d(np.packbits(a, axis=-1), np.packbits(b, axis=-1))]

对于足够大的
a
,您可能需要使用基于排序或
set
的方法进一步加快速度。

输入是否始终为0和1?宽度的限制是什么?两个数组的宽度相同,输入总是1和0。宽度有上限吗?例如,它是否总是小于64?数组_b是通过查找数组_a中的唯一行生成的。所以它们的宽度是一样的。我只是想确保我没有发布一个假设可以容纳64列的答案,然后就无法处理真实数据的答案
a[mask, :]
a[np.in1d(np.packbits(a, axis=-1), np.packbits(b, axis=-1))]