【发布时间】:2018-05-04 00:14:17
【问题描述】:
我必须创建一个数据结构来将每个点到每个其他点的距离存储在一个非常大的二维坐标数组中。小数组很容易实现,但是超过 50,000 点后我开始遇到内存问题——这并不奇怪,因为我正在创建一个 n x n 矩阵。
这是一个运行良好的简单示例:
import numpy as np
from scipy.spatial import distance
n = 2000
arr = np.random.rand(n,2)
d = distance.cdist(arr,arr)
cdist 速度很快,但存储效率低,因为矩阵是对角镜像的(例如d[i][j] == d[j][i])。我可以使用np.triu(d) 转换为上三角矩阵,但生成的方阵仍然占用相同的内存。我也不需要超过某个截止值的距离,所以这会很有帮助。下一步是转换为稀疏矩阵以节省内存:
from scipy import sparse
max_dist = 5
dist = np.array([[0,1,3,6], [1,0,8,7], [3,8,0,4], [6,7,4,0]])
print dist
array([[0, 1, 3, 6],
[1, 0, 8, 7],
[3, 8, 0, 4],
[6, 7, 4, 0]])
dist[dist>=max_dist] = 0
dist = np.triu(dist)
print dist
array([[0, 1, 3, 0],
[0, 0, 0, 0],
[0, 0, 0, 4],
[0, 0, 0, 0]])
sdist = sparse.lil_matrix(dist)
print sdist
(0, 1) 1
(2, 3) 4
(0, 2) 3
对于一个非常大的数据集,问题在于快速获取该稀疏矩阵。重申一下,使用 cdist 制作方阵是我所知道的计算点之间距离的最快方法,但中间方阵会耗尽内存。我可以将其分解为更易于管理的行块,但这会大大减慢速度。我觉得我缺少一些从cdist 直接进入稀疏矩阵的明显简单方法。
【问题讨论】: