0

我一直在寻找这种类型问题的解决方案:例如(因为我的真正问题更复杂):

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

还有其他方法可以实现我的目标吗?

4

1 回答 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], 没有其他匹配项。

于 2013-02-21T12:57:12.877 回答