Python 在两个 n x 1 的 numpy 数组中查找匹配项

0 投票
1 回答
1061 浏览
提问于 2025-04-17 16:37

我已经找了一段时间想解决这样的问题:

import numpy

a=[numpy.array([1,2]),numpy.array([2,2]),numpy.array([3,2]),numpy.array([4,2])]
b=[numpy.array([2,2]),numpy.array([3,2]),numpy.array([6,2]),numpy.array([5,2]),numpy.array([5,2])]

ya=numpy.array([1,2,3,4])
size_a=len(a)
size_b=len(b)
yb=numpy.empty((size_b,1))
yb.fill(numpy.nan)

for i in xrange(size_b):
    for j in xrange(size_a):
        if numpy.array_equiv(yb,ya):
            ya[i]=yb[j]

我只是想用数组b中某个元素匹配到的索引位置的ya值来填充yb。因为yb的长度比ya长,所以在循环结束时,yb的后面部分出现“nan”是正常的。下面的代码运行时间太长了。实际上,我不知道它是否有效,因为我没有等到循环结束就停止了...

在实际情况下,ya和yb的长度分别是7007和3525。

有没有其他方法可以实现我的目标呢?

1 个回答

1

要在数组列表之间找到匹配项,最简单的方法就是把这些列表调整成相同的形状,比如 n x m 这样的格式。你可以用 np.tile 来做到这一点,但使用 stride_tricks 会更快一些:

a = np.array(a)
b = np.array(b)
shape = (2, a.shape[0], b.shape[0])
from numpy.lib.stride_tricks import as_strided
a = as_strided(a, shape=shape, strides=(a.strides[1], a.strides[0], 0))
b = as_strided(b, shape=shape, strides=(b.strides[1], 0, b.strides[0]))
np.where(np.all(a == b, axis=0))

这样就得到了结果

(array([1, 2]), array([0, 1]))

也就是说,a[1] == b[0],还有 a[2] == b[1],没有其他的匹配。

撰写回答