我需要计算两组向量source_matrix
和target_matrix
之间的距离。
当source_matrix
和target_matrix
都属于scipy.sparse.csr.csr_matrix
类型时,我有以下行:
distances = sp.spatial.distance.cdist(source_matrix, target_matrix)
我最终获得了以下部分异常回溯:
File "/usr/local/lib/python2.7/site-packages/scipy/spatial/distance.py", line 2060, in cdist
[XA] = _copy_arrays_if_base_present([_convert_to_double(XA)])
File "/usr/local/lib/python2.7/site-packages/scipy/spatial/distance.py", line 146, in _convert_to_double
X = X.astype(np.double)
ValueError: setting an array element with a sequence.
这似乎表明稀疏矩阵被视为密集的numpy矩阵,它们都失败了,并且忽略了使用稀疏矩阵的观点。
有什么建议吗?
答案 0 :(得分:3)
我感谢这篇文章很老,但正如其中一条评论建议的那样,你可以使用接受稀疏向量和矩阵的sklearn implementation。
以两个随机向量为例
a = scipy.sparse.rand(m=1,n=100,density=0.2,format='csr')
b = scipy.sparse.rand(m=1,n=100,density=0.2,format='csr')
sklearn.metrics.pairwise.pairwise_distances(X=a, Y=b, metric='euclidean')
>>> array([[ 3.14837228]]) # example output
即使a
是矩阵且b
是向量:
a = scipy.sparse.rand(m=500,n=100,density=0.2,format='csr')
b = scipy.sparse.rand(m=1,n=100,density=0.2,format='csr')
sklearn.metrics.pairwise.pairwise_distances(X=a, Y=b, metric='euclidean')
>>> array([[ 2.9864606 ], # example output
[ 3.33862248],
[ 3.45803465],
[ 3.15453179],
...
Scipy spatial.distance不支持稀疏矩阵,因此sklearn将是这里的最佳选择。您还可以将n_jobs
参数传递给sklearn.metrics.pairwise.pairwise_distances
,如果您的向量非常大,则会分配计算。
希望有所帮助