所以,排好你的队伍吧。 (很遗憾,没有给我可以复制粘贴的输入。 (in[114]:data=[4、1、2、2、1、1、4、3、2]
in [ 115 ] 3360 col=[ 0,1,1,2,2,3,4,4 ]
in [ 116 ] 3360 row=[ 2,0,4,0,3,5,0,2,3 ]
in [ 117 ] : m=sparse.CSR _ matrix ((data,(col,row ) )
In [118]: M
Out[118]:
5x6 sparse matrix of type ' '
with9storedelementsincompressedsparserowformat
In [119]: M.A
Out[119]:
array ([ 0,0,4,0,0,0 ],
[ 1,0,0,0,2,0 ],
[ 2,0,0,1,0,0 ],
[ 0,0,0,0,0,1 ],
[ 4,0,3,2,0,0 ] )
in [ 121 ] 3360 center=NP.array [ [ 0,1,2,2,4,1 ],[ 3,4,1,2,4,0 ] ]
那么怎么计算距离? 米. a为[ 5,6 ],中心为[ 2,6 ]。 这两个序列的用途尚不清楚。 在
对于访问“原始”稀疏值,coo格式最容易理解。 这与我用来创建矩阵的行、列和数据相同
^{pr2}$
csr将相同的信息存储在data、indices和indptr数组中。 但是,要从最后两个中提取I、j的值,需要进行一些数学运算。 csr乘法例行程序很好地利用了这些数组。 在
一般来说,与csr矩阵的乘法比加法/减法更好。 在
我等你再弄清楚。 在spatial.distance.cdist(center,M.A,' euclidean ' )中
Out[156]:
Array ([ 5.09901951,3.87298335,5.19615242,5 .5.91607978] ),
[7.34846923、5.38516481、5.91607978、6.8556546、6.08276253]
我们要做的是研究这个函数,理解它的输入。 我们可能会看到超出那个文档的代码。 在
但是,查看这段代码,我们看到了一些步骤来确保xB是二维数组,列数与xA相同。 然后对于euclidian,调用_ distance _ wrap.cdist _ euclidean _ wrap (_ convert _ to _ double (xa ) ),
_convert_to_double(XB ),dm ) )
看起来像c语言的说唱歌手。 我无法想象提供稀疏矩阵的方法是什么。 在
可以重复行; 使用M[[0],].A调用dist与{}相同,但速度不同。 迭代矩阵的行有点慢。 因为每次迭代都会构造新的稀疏矩阵。 csr和{}是行迭代最快的两个。 在
介绍几种直接迭代lil格式属性的方法。 deffoo(a、b、n ) :
# make a dense array from data,row
RES=NP.Zeros((1,n ) )
res[0,b]=a
返回RES
In [190]: Ml=M.tolil () ) )。
In [191]: Ml.data
out [ 191 ] 3360阵列([4]、[ 1,2 ]、[ 2,1 ]、[1]、[ 4,3,2 ]、dtype=object ) ) ) ) ) ) )
In [192]: Ml.rows
Out[192]: array([[2],[ 0,4 ],[ 0,3 ],[5],[ 0,2,3 ],dtype=object
in[193]3360rowgen=(foo(a,b,6 ) for a,binzip (ml.data,Ml.rows ) ) ) ) )。
in [ 194 ] : NP.concatenate ([ spatial.distance.cdist (center,row,' euclidean ' ) for row in rowgen] ),axis=1
Out[194]:
Array ([ 5.09901951,3.87298335,5.19615242,5 .5.91607978] ),
[7.34846923、5.38516481、5.91607978、6.8556546、6.08276253]
现在跳过时间测试。 在