私は値の2次元行列を持っています。各行はデータポイントです。私のテスト・ポイントのような単一1D numpyの配列である場合多次元データでnumpyを使用してユークリッド距離の外側ループをベクトル化する
data = np.array(
[[2, 2, 3],
[4, 2, 4],
[1, 1, 4]])
今:
test = np.array([2,3,3])
私はすべての3つのデータポイントにテストポイントの相対的な距離を計算するnp.sqrt(np.sum((test-data)**2,axis=1))
のような単純な何かを行うことができます。テストポイントの2Dアレイをテストするためにそれ自身である場合
しかし、上記機能せず、私のような何かを使用して:に対して設定私のテストの各点を計算するために
test = np.array([[2,3,3],[4,1,2]])
for i in range(len(test)):
print np.sqrt(np.sum((test[i]-data)**2,axis=1))
>>> [ 1. 2.44948974 2.44948974]
[ 2.44948974 2.23606798 3.60555128]
をデータセット内のすべての点。この全体の操作をベクトル化して、対応する距離の行列を外部のFORループなしで返すようにする必要があるようです。
(注:この特定の例はユークリッド距離についてですが、I同じタイプの操作で、あるマトリックスのすべての要素を別のマトリックスの個々の要素で操作したいと思っているので、Numpyを使用してこの性質の問題を設定する一般的な方法があることを願っています。
これが動作しているようですが、私は大規模のメモリ使用量が心配です各テストポイントをN回複製する必要があるように見えるデータセット。ここで、Nは開始するデータポイントの数です。したがって、1000のデータポイントがある場合は、2つの値をテストするために2000ポイントの行列を作成する必要があります。 'print np.reshape(np.sqrt(np.sum(np.repeat(test、len(data)、axis = 0)、(len(test)* len(data)、Xdims) )、 (2、len(data)))。T' –
[scipyのcdist](http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.spatial.distance.cdist.html)を使用してください: 'from scipy.spatial.distance輸入cdist; out = cdist(テスト、データ) '。それは超効率的です。 – Divakar