Nir*_*Izr 5 python numpy scipy
我需要计算两组向量之间的距离,source_matrix和target_matrix。
当source_matrix和target_matrix都是类型时,我有以下行scipy.sparse.csr.csr_matrix:
distances = sp.spatial.distance.cdist(source_matrix, target_matrix)
Run Code Online (Sandbox Code Playgroud)
我最终得到以下部分异常回溯:
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.
Run Code Online (Sandbox Code Playgroud)
这似乎表明稀疏矩阵被视为密集的 numpy 矩阵,这既失败又错过了使用稀疏矩阵的意义。
有什么建议吗?
我很欣赏这篇文章很旧,但正如建议的评论之一,您可以使用接受稀疏向量和矩阵的sklearn 实现。
以两个随机向量为例
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
Run Code Online (Sandbox Code Playgroud)
或者即使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],
...
Run Code Online (Sandbox Code Playgroud)
Scipy spatial.distance 不支持稀疏矩阵,所以 sklearn 将是这里的最佳选择。如果您的向量非常大,您还可以传递分配计算的n_jobs参数sklearn.metrics.pairwise.pairwise_distances。
希望有帮助