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