What tool can I use in this situation...?
を。 a
とb
が一次元numpyのアレイであることを仮定すると、あなたはまた、this threadで提案されている方法のいずれかを使用することができますあなたが1で計算したい場合
import numpy as np
np.linalg.norm(a-b)
np.sqrt(np.sum((a-b)**2))
np.sqrt(np.dot(a-b, a-b))
をペアワイズ距離(必ずしもユークリッド距離を行きます)あなたの配列のすべてのポイントの間に、モジュールscipy.spatial.distance
はあなたの友人です。
デモ:このおもちゃの例で使用モックデータアレイ内の点の数は得られたペアワイズ距離アレイ要素を有していること
In [79]: from scipy.spatial.distance import squareform, pdist
In [80]: arr = np.asarray([[0, 0, 0],
...: [1, 0, 0],
...: [0, 2, 0],
...: [0, 0, 3]], dtype='float')
...:
In [81]: squareform(pdist(arr, 'euclidean'))
Out[81]:
array([[ 0. , 1. , 2. , 3. ],
[ 1. , 0. , 2.23606798, 3.16227766],
[ 2. , 2.23606798, 0. , 3.60555128],
[ 3. , 3.16227766, 3.60555128, 0. ]])
In [82]: squareform(pdist(arr, 'cityblock'))
Out[82]:
array([[ 0., 1., 2., 3.],
[ 1., 0., 3., 4.],
[ 2., 3., 0., 5.],
[ 3., 4., 5., 0.]])
注意。
...and what max possible size for this tools?
あなたは()あなたのデータを使用して、上記のアプローチを適用しようとすると、エラーが表示されます。
In [105]: data = np.random.random(size=(217000, 3))
In [106]: squareform(pdist(data, 'euclidean'))
Traceback (most recent call last):
File "<ipython-input-106-fd273331a6fe>", line 1, in <module>
squareform(pdist(data, 'euclidean'))
File "C:\Users\CPU 2353\Anaconda2\lib\site-packages\scipy\spatial\distance.py", line 1220, in pdist
dm = np.zeros((m * (m - 1)) // 2, dtype=np.double)
MemoryError
問題は、あなたがRAMの不足しているです。このような計算を実行するには、350TB以上が必要です!必要なメモリ量は、距離行列(217000 )の要素数に、その行列の各要素のバイト数(8)を掛け、適切な係数(1024 )ギガバイトで結果を表現する:
In [107]: round(data.shape[0]**2 * data.dtype.itemsize/1024.**3)
Out[107]: 350.8
だからあなたのデータの最大許容サイズは、(詳細はthis threadを見てみましょう)利用できるRAMの量によって決定されます。
**点2点**(点nr 5と点nr 214987)または**点**(点nr 1と点nr 2の間、次に点nr 1の間)の距離を計算する必要がありますか?とポイントnr 3、....)? –
配列とアイテムのサイズは? – martineau