0

私はpythonandnumpyを使用して、2 つの配列または等しい形状を座標 (x、y、z) と比較して、次のように一致させます。

coordsCFS
array([[ 0.02      ,  0.02      ,  0.        ],
       [ 0.03      ,  0.02      ,  0.        ],
       [ 0.02      ,  0.025     ,  0.        ],
        ..., 
       [ 0.02958333,  0.029375  ,  0.        ],
       [ 0.02958333,  0.0290625 ,  0.        ],
       [ 0.02958333,  0.0296875 ,  0.        ]])

coordsRMED
array([[ 0.02      ,  0.02      ,  0.        ],
       [ 0.02083333,  0.02      ,  0.        ],
       [ 0.02083333,  0.020625  ,  0.        ],
       ..., 
       [ 0.03      ,  0.0296875 ,  0.        ],
       [ 0.02958333,  0.03      ,  0.        ],
       [ 0.02958333,  0.0296875 ,  0.        ]]) 

データは、h5py を使用して 2 つの hdf5 ファイルから読み取られます。比較のために、「ほぼ等しい」かどうかをテストするallcloseを使用します。座標は、Python の通常の浮動小数点精度内で一致しません。これが for ループを使用した理由ですnumpy.where。私は通常、for ループを回避しようとしますが、このコンテキストでは方法がわかりませんでした。そこで、この驚くほど遅いスニペットを思いつきました。

mapList = []
for cfsXYZ in coordsCFS:
    # print cfsXYZ
    indexMatch = 0
    match = []
    for asterXYZ in coordRMED:
        if numpy.allclose(asterXYZ,cfsXYZ):
            match.append(indexMatch)
            # print "Found match at index " + str(indexMatch)
            # print asterXYZ
        indexMatch += 1

    # check: must only find one match. 
    if len(match) != 1:
        print "ERROR matching"
        print match
        print cfsXYZ
        return 1

    # save to list
    mapList.append(match[0])

if len(mapList) != coordsRMED.shape[0]:
    print "ERROR: matching consistency check"
    print mapList
    return 1

これは、私のテスト サンプル サイズ (800 行) では非常に遅いです。もっと大きなセットを比較する予定です。一貫性チェックを削除してbreak、内側の for ループで使用すると、速度が向上します。まだ良い方法はありますか?

4

3 に答える 3

1

次のような方法で内側のループを取り除くことができます。

for cfsXYZ in coordsCFS:
    match = numpy.nonzero(
        numpy.max(numpy.abs(coordRMED - cfsXYZ), axis=1) < TOLERANCE)
于 2012-10-05T08:39:35.120 に答える
1

1 つの解決策は、両方の配列を並べ替えることです (並べ替えられた配列に元のインデックスが含まれるようにインデックス列を追加します)。次に、一致させるために、ロックステップで配列をステップ実行します。正確な 1 対 1 の対応を期待しているので、常に行のペアを一致させることができるはずです。

于 2012-10-05T05:52:10.893 に答える
1

最初に覚えておくべきことは、NumPy のデフォルトでは、「反復は常に C スタイルの連続した方法で進行する (最後のインデックスが最も速く変化する)」[1] ことです。反復の順序を逆にすることで物事を改善できるかもしれません ( の反復、 ...coordMED.Tの転置)coordMED

それにもかかわらず、私はあなたがループを必要としていることにまだ驚いています: あなたは「座標が python の通常の浮動小数点精度内で一致しない」と主張しています:ドキュメントに記載されているように、のrtolおよびatolパラメータを調整しようとしましたか?np.allclose

[1]

于 2012-10-05T08:15:34.093 に答える