1

座標を3つの異なる配列(xa、ya、za)に格納したポイントセットがあります。ここで、この点セット(xa [0]、ya [0]、za [0]など)の各点と別の点セット(xb、yb、zb)のすべての点との間のユークリッド距離を計算します。 )そして毎回最小距離を新しい配列に保存します。

xa.shape =(11、)、ya.shape =(11、)、za.shape =(11、)としましょう。それぞれ、xb.shape =(13、)、yb.shape =(13、)、zb.shape =(13、)。私がやりたいのは、毎回1つのxa []、ya []、za []を取り、xb、yb、zbのすべての要素との距離を計算し、最後に最小値をxfinalに格納することです。 shape =(11、)配列。

これはnumpyで可能だと思いますか?

4

3 に答える 3

8

別の解決策は、scipyの空間モジュール、特にKDTreeを使用することです。

このクラスは一連のデータから学習し、新しいデータセットを指定して問い合わせることができます。

from scipy.spatial import KDTree
# create some fake data
x = arange(20)
y = rand(20)
z = x**2
# put them togheter, should have a form [n_points, n_dimension]
data = np.vstack([x, y, z]).T
# create the KDTree
kd = KDTree(data)

これで、ポイントがある場合は、次の手順を実行するだけで、クローゼットポイント(またはN個の最も近いポイント)の距離とインデックスを尋ねることができます。

kd.query([1, 2, 3])
# (1.8650720813822905, 2)
# your may differs

または、位置の配列が与えられた場合:

#bogus position
x2 = rand(20)*20
y2 = rand(20)*20
z2 = rand(20)*20
# join them togheter as the input
data2 = np.vstack([x2, y2, z2]).T
#query them
kd.query(data2)

#(array([ 14.96118553,   9.15924813,  16.08269197,  21.50037074,
#    18.14665096,  13.81840533,  17.464429  ,  13.29368755,
#    20.22427196,   9.95286671,   5.326888  ,  17.00112683,
#     3.66931946,  20.370496  ,  13.4808055 ,  11.92078034,
#     5.58668204,  20.20004206,   5.41354322,   4.25145521]),
#array([4, 3, 2, 4, 2, 2, 4, 2, 3, 3, 2, 3, 4, 4, 3, 3, 3, 4, 4, 4]))
于 2013-03-15T15:42:13.803 に答える
1

を使用して、各xaから各xbへの差を計算できますnp.subtract.outer(xa, xb)。最も近いxbまでの距離は次の式で与えられます。

np.min(np.abs(np.subtract.outer(xa, xb)), axis=1)

これを3Dに拡張するには、

distances = np.sqrt(np.subtract.outer(xa, xb)**2 + \
    np.subtract.outer(ya, yb)**2 + np.subtract.outer(za, zb)**2)
distance_to_nearest = np.min(distances, axis=1)

どのbポイントが最も近いかを実際に知りたい場合はargmin、の代わりにを使用しますmin

index_of_nearest = np.argmin(distances, axis=1)
于 2013-03-15T15:15:14.143 に答える
0

これを行うには複数の方法があります。最も重要なことは、メモリ使用量と速度の間にトレードオフがあることです。無駄な方法は次のとおりです。

s = (1, -1)
d = min((xa.reshape(s)-xb.reshape(s).T)**2
     + (ya.reshape(s)-yb.reshape(s).T)**2
     + (za.reshape(s)-zb.reshape(s).T)**2), axis=0)

bもう1つの方法は、本格的なマトリックスへの拡張を回避するために、設定されたポイントを反復処理することです。

于 2013-03-15T15:42:44.337 に答える