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の1つの要素に一致する要素のインデックスの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 に答える