【发布时间】:2020-09-10 04:52:25
【问题描述】:
问题: 我有一个大约 [350000, 1] 的向量,我希望计算成对距离。这会导致不适合 RAM 的整数数据类型的 [350000, 350000] 矩阵。我最终想得到一个布尔值(适合 RAM),所以我目前一次只做一个元素,但这不是很省时。
编辑:由于数据的大小,标准的 sklearn 和 scipy 函数不起作用——但如果我能以某种方式将其分块以使用硬盘,那么我应该能够使用这些。
问题可视化: [a_1, a_2, a_3]^t -> [[a_1 - a_1, a_1 - a_2, a_1 - a_3], [a_2 - a_1, a_2 - a_2, a_2 - a_3], [a_3 - a_1, a_3 - a_2, a_3 - a_3]]
注意,取abs值时,只需要计算上三角形,因为它是对称的。
需要分块或替代解决方案的矢量化代码: 我找到了一种方法来计算所有点之间的距离(减法),该方法使用广播在一个小矩阵上工作,但需要一种能够在更大的矩阵上执行此操作而不会遇到 RAM 限制的方法。
或者也许可以建议一种更快的 MWE 下面的更好方法?
distMatrix = np.absolute((points[np.newaxis, :, :] - points[:, np.newaxis, :])[:, :, 0])
其他尝试: 我尝试过使用 dask 和 memmap,但仍然出现内存错误,所以一定是做错了什么。我也尝试过 memmap 并手动分块数据,但没有获得完整的结果集,因此非常感谢任何帮助。
当前方法的 MWE:
## Data ##
#Note that the datatype and code may not match up exactly as just creating to demonstrate. Essentially want to take first column and create distance matrix with itself through subtracting, and then take 2nd and 3rd column and create euclidean distance matrix.
data = np.random.randint(1, 5, size=[350001,3])
minTime = 3
maxTime = 4
minDist = 1
maxDist = 2
### CODE ###
n = len(data)
for i in trange(n):
for j in range(i+1, n):
#Within time threshold?
if minTime <= (data[j][idxT] - data[i][idxT]) <= maxTime:
#Within distance threshold?
xD = math.pow(data[j][idxX] - data[i][idxX], 2)
yD = math.pow(data[j][idxY] - data[i][idxY], 2)
d = math.sqrt(xD + yD)
#If within threshold then
if minDist <= d <= maxDist:
#DO SOMETHING
原因: 我有大约 350000 个点的时间、x_coordinate、y_coordinate 向量。我想计算所有时间点之间的距离(简单减法)和每个(x,y)点之间的欧几里得距离。然后,我希望能够识别在彼此的时间和距离发生阈值内的所有点对,从而产生一个布尔值。
【问题讨论】:
-
这能回答你的问题吗? Fastest pairwise distance metric in python
-
您对欧几里得距离还是基于绝对距离的距离感兴趣?
-
@Divakar 对两者都感兴趣,但如果我得到基于绝对值的工作,那么我可以从那里计算欧几里得
-
你能用示例数据添加最少的可运行代码吗?
-
@Divakar 已修改。
标签: python numpy distance chunking