2017-01-18 21 views
2

私は配列n*mを持っています。ここではn=217000m=3(望遠鏡からのデータ)です。大きな配列の3Dの2点間の距離

3Dの2点間の距離を計算する必要があります(x、y、zの座標を列で表します)。

私はsklearnツールを使用しようとすると結果は次のとおりです。

私はこのツールのために、このような状況で使用し、可能な最大サイズ何ができるかのツール

ValueError: array is too big; arr.size * arr.dtype.itemsize is larger than the maximum possible size.

+1

**点2点**(点nr 5と点nr 214987)または**点**(点nr 1と点nr 2の間、次に点nr 1の間)の距離を計算する必要がありますか?とポイントnr 3、....)? –

+0

配列とアイテムのサイズは? – martineau

答えて

1

のみPythonと3次元のEuclidean distance式使用:あなたは@Saksowによって提案されたアプローチを使用して、独自のユークリッド距離関数を実装することができ

import math 
distance = math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2 + (z1 - z2) ** 2) 
+1

私はあなたが '** 2'を意味すると思っています –

+0

ああ、申し訳ありません、それは全く異なる何かです、ありがとう – Saksow

+1

確かに、私はそれに行きます。ツールを複雑にする点はありません。あなたは答えに私を打つ。 :D – Dalen

2

What tool can I use in this situation...?

を。 abが一次元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)) 

をペアワイズ距離(必ずしもユークリッド距離を行きます)あなたのn*m配列のすべてのポイントの間に、モジュールscipy.spatial.distanceはあなたの友人です。

デモ:このおもちゃの例で使用モックデータアレイ内の点の数はn=4得られたペアワイズ距離アレイn^2=16要素を有していること

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?

あなたは(n=217000)あなたのデータを使用して、上記のアプローチを適用しようとすると、エラーが表示されます。

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の量によって決定されます。

関連する問題