如何有效地过滤numpy数组,使其包含第二个数组中包含的行
事实上,a有十万行b是一个固定大小如何有效地过滤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 = 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))]