【发布时间】:2020-09-08 04:01:16
【问题描述】:
我有这个 python 代码来计算不同点之间的坐标距离。
IDs,X,Y,Z
0-20,193.722,175.733,0.0998975
0-21,192.895,176.727,0.0998975
7-22,187.065,178.285,0.0998975
0-23,192.296,178.648,0.0998975
7-24,189.421,179.012,0.0998975
8-25,179.755,179.347,0.0998975
8-26,180.436,179.288,0.0998975
7-27,186.453,179.2,0.0998975
8-28,178.899,180.92,0.0998975
代码运行良好,但由于我现在拥有的坐标量非常大(~50000),我需要优化这段代码,否则无法运行。有人可以建议我一种更节省内存的方法吗?感谢您的任何建议。
#!/usr/bin/env python
import pandas as pd
import scipy.spatial as spsp
df_1 =pd.read_csv('Spots.csv', sep=',')
coords = df_1[['X', 'Y', 'Z']].to_numpy()
distances = spsp.distance_matrix(coords, coords)
df_1['dist'] = distances.tolist()
# CREATES columns d0, d1, d2, d3
dist_cols = df_1['IDs']
df_1[dist_cols] = df_1['dist'].apply(pd.Series)
df_1.to_csv("results_Spots.csv")
【问题讨论】:
-
你能添加一些数据吗,因为
read_csv在这里没有帮助。我们不需要 50K,但足以看到你的代码做了什么 -
这一步“coords = ... .to_numpy()”很可能可以去掉。 pandas 使用 numpy 数据类型;无需复制。 (样本数据+1)
-
你从哪里开始遇到内存错误?
-
紧随其后:distances = spsp.distance_matrix(coords, coords) Traceback(最近一次调用最后一次):文件“
”,第 1 行,在 文件“/mnt/lib/ python3.7/site-packages/scipy/spatial/kdtree.py", line 989, in distance_matrix result = np.empty((m,n),dtype=float) # FIXME: 找出最好的 dtype MemoryError: Unable to为形状为 (34076, 34076) 且数据类型为 float64 的数组分配 8.65 GiB -
只看矩阵的三角形,你几乎可以将这个数字减半......
标签: python pandas numpy scipy numpy-ndarray