Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 大型阵列的三维两点之间的距离_Python_Numpy_Scikit Learn_Distance - Fatal编程技术网

Python 大型阵列的三维两点之间的距离

Python 大型阵列的三维两点之间的距离,python,numpy,scikit-learn,distance,Python,Numpy,Scikit Learn,Distance,我有一个数组n×m,其中n=217000和m=3(一些来自望远镜的数据) 我需要计算3D中两个点之间的距离(根据我在列中的x、y、z坐标) 当我尝试使用sklearn工具时,结果是: ValueError: array is too big; `arr.size * arr.dtype.itemsize` is larger than the maximum possible size. 在这种情况下,我可以使用什么工具?该工具的最大可能大小是多少?仅对三维使用Python和公式: impor

我有一个数组
n
×
m
,其中
n=217000
m=3
(一些来自望远镜的数据)

我需要计算3D中两个点之间的距离(根据我在列中的x、y、z坐标)

当我尝试使用
sklearn
工具时,结果是:

ValueError: array is too big; `arr.size * arr.dtype.itemsize` is larger than the maximum possible size.
在这种情况下,我可以使用什么工具?该工具的最大可能大小是多少?

仅对三维使用Python和公式:

import math
distance = math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2 + (z1 - z2) ** 2)
在这种情况下,我可以使用什么工具

您可以使用@Saksow建议的方法自行实现欧几里德距离函数。假设
a
b
是一维NumPy数组,您也可以使用以下建议的任何方法:

如果您希望一次性计算数组中所有点之间的成对距离(不一定是欧几里德距离),那么模块就是您的朋友

演示:

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.]])
请注意,此玩具示例中使用的模拟数据数组中的点数为,并且生成的成对距离数组包含元素

…此工具的最大可能尺寸是多少

如果尝试使用数据()应用上述方法,则会出现错误:

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的数量决定(查看更多详细信息)。

您是否需要仅计算2个点之间的距离(即点nr 5和点nr 214987)或所有点之间的距离(即点nr 1和点nr 2,然后是点nr 1和点nr 3…)?阵列和项目大小是多少?我猜你的意思是
**2
哦,是的,对不起,这完全不同,谢谢。所以,我会同意的。没有必要使工具复杂化。你抢先找到了答案D
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
In [107]: round(data.shape[0]**2 * data.dtype.itemsize / 1024.**3)
Out[107]: 350.8