http://blog.csdn.net/canglingye/article/details/41316193
【相互轉換】:http://stackoverflow.com/questions/32456808/sparsevector-to-densevector-conversion-in-pyspark
1、稀疏矩陣和稠密矩陣可以轉換成數組
2、數組可以轉換成稠密矩陣
3、稀疏矩陣不能直接轉換為稠密矩陣,需要先轉換為數組;但是,數組和稠密矩陣都不能直接轉換為稀疏矩陣
from pyspark.mllib.linalg import SparseVector, DenseVector
s1=SparseVector(5,{4:1.})
>>> s1
SparseVector(5, {4: 1.0})
>>> a1=s1.toArray()
>>> a1
array([ 0., 0., 0., 0., 1.])
d1=DenseVector(a1)
>>> d1
DenseVector([0.0, 0.0, 0.0, 0.0, 1.0])
a2=d1.toArray()
>>> a2
array([ 0., 0., 0., 0., 1.])
通過函數將rdd轉成稀疏矩陣
####轉稀疏矩陣
def sparse(p):
vec=[int(x) for x in p[2:]]
lvec=len(vec)
dic1={}
for i in range(lvec):
if vec[i]==1:
dic1[i]=1
return [p[0],p[1],SparseVector(lvec,dic1)]
lt11=lt8.map(sparse)
>>> lt11.take(2)
[ [u'ANDROID-5a9ac5c22ad94e26b2fa24e296787a35', u'0', SparseVector(10000, {3: 1.0, 13: 1.0, 64: 1.0, 441: 1.0, 801: 1.0})],
[u'ANDROID-188949641b6c4f1f8c1c79b5c7760c2f', u'0', SparseVector(10000, {2: 1.0, 3: 1.0, 4: 1.0, 13: 1.0, 27: 1.0, 39: 1.0, 41: 1.0, 150: 1.0, 736: 1.0, 9675: 1.0})] ]
1、本地向量
- import org.apache.spark.mllib.linalg.{Vector, Vectors}
- //創建一個稠密向量
- val dv : Vector = Vector.dense(1.0,0.0,3.0);
- //創建一個稀疏向量(第一種方式)
- val sv1: Vector = Vector.sparse(3, Array(0,2), Array(1.0,3.0));
- //創建一個稀疏向量(第二種方式)
- val sv2 : Vector = Vector.sparse(3, Seq((0,1.0),(2,3.0))
對於稠密向量:很直觀,你要創建什么,就加入什么,其函數聲明為Vector.dense(values : Array[Double])
對於稀疏向量,當采用第一種方式時,3表示此向量的長度,第一個Array(0,2)表示的索引,第二個Array(1.0, 3.0)與前面的Array(0,2)是相互對應的,表示第0個位置的值為1.0,第2個位置的值為3