私はpython
andnumpy
を使用して、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 ループで使用すると、速度が向上します。まだ良い方法はありますか?