问题:
我有一个大约为 [350000,1] 的向量,我希望计算成对距离。这会导致一个整数数据类型的[350000, 350000]矩阵,无法适应RAM。最终我想要得到一个布尔值(适合RAM),所以我目前正在一次处理一个元素,但效率不高。
请注意,只有上三角需要计算,因为在取绝对值时对称。 需要分块或其他解决方案的矢量化代码: 我已经找到了一种计算所有点之间距离(差)的方法,并在小矩阵上使用广播进行了计算,但需要一种方法能够在更大的矩阵上进行计算而不会超过 RAM 限制。 或者可能有更快的改进 MWE(最小工作示例)的方法?
编辑:标准的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]]请注意,只有上三角需要计算,因为在取绝对值时对称。 需要分块或其他解决方案的矢量化代码: 我已经找到了一种计算所有点之间距离(差)的方法,并在小矩阵上使用广播进行了计算,但需要一种方法能够在更大的矩阵上进行计算而不会超过 RAM 限制。 或者可能有更快的改进 MWE(最小工作示例)的方法?
distMatrix = np.absolute((points[np.newaxis, :, :] - points[:, np.newaxis, :])[:, :, 0])
其他尝试: 我尝试使用dask和memmap,但仍然遇到内存错误,因此一定是做了些错误的操作。 我还尝试了memmap并手动分块数据,但无法获得完整的结果,因此需要任何帮助。
当前方法的最小可复现示例:
## 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轴和y轴坐标向量。我想计算所有时间点之间的距离(简单减法)以及每个(x,y)点之间的欧几里得距离。然后,我想能够识别所有在时间和距离阈值内的点对,并生成一个布尔值。
idxT
、idxX
、idxY
的示例代表值是什么? - Divakar