Python 从scipy稀疏矩阵创建稀疏RDD

Python 从scipy稀疏矩阵创建稀疏RDD,python,numpy,apache-spark,scipy,pyspark,Python,Numpy,Apache Spark,Scipy,Pyspark,我有一个来自scipy的大型稀疏矩阵(300k x 100k,所有二进制值,大部分为零)。我想将这个矩阵的行设置为RDD,然后对这些行进行一些计算——在每行上计算一个函数,在成对的行上计算函数,等等 关键是它非常稀疏,我不想分解集群——我可以将行转换成稀疏的行吗?或者把整件事都变成SparseMatrix 你能举一个例子,在这个例子中,你读取一个稀疏数组,将行设置成一个RDD,然后从这些行的笛卡尔积中计算出一些东西吗?你唯一需要做的就是toarray() 将numpy导入为np 将scipy.s

我有一个来自scipy的大型稀疏矩阵(300k x 100k,所有二进制值,大部分为零)。我想将这个矩阵的行设置为RDD,然后对这些行进行一些计算——在每行上计算一个函数,在成对的行上计算函数,等等

关键是它非常稀疏,我不想分解集群——我可以将行转换成稀疏的行吗?或者把整件事都变成SparseMatrix


你能举一个例子,在这个例子中,你读取一个稀疏数组,将行设置成一个RDD,然后从这些行的笛卡尔积中计算出一些东西吗?

你唯一需要做的就是
toarray()

将numpy导入为np
将scipy.sparse导入为SP
#创建一个稀疏矩阵
row=np.array([0,2,2,0,1,2])
col=np.array([0,0,1,2,2,2])
data=np.array([1,2,3,4,5,6])
sv=sps.csc_矩阵((数据,(行,列)),形状=(3,3))
sv.toarray()
>数组([[1,0,4],
>       [0, 0, 5],
>       [2, 3, 6]])
类型(sv)
#将sv读取为RDD
sv_rdd=sc.parallelize(sv.toarray())#将SAPSE传输到阵列
sv_rdd.collect()
>[数组([1,0,4]),数组([0,0,5]),数组([2,3,6])]
类型(sv\U rdd)
> 
我最近遇到了这个问题——我认为可以通过使用scipy csc_矩阵属性构造SparseMatrix直接进行转换。(借用杨布莱恩)


尝试使用。@EliSadoff我正在使用pyspark,问题是我不知道要使用哪些对象或如何设置它们。啊,我没有意识到这一点。我还以为你想弄清楚如何从python到scala。对,但这会把行编码成稀疏向量吗?我不这么认为。在
toarray()
之后,它变成了一个ndarray。我担心的是,在RDD的每个条目中以密集数组的形式存储它会浪费空间-我能自动将scipy稀疏矩阵转换为PySpark中的一个稀疏存储类吗?我知道你的担心,但到目前为止,似乎还没有更好的方法将scipy稀疏矩阵直接转换为spark稀疏矩阵。
import numpy as np
import scipy.sparse as sps

# create a sparse matrix
row = np.array([0, 2, 2, 0, 1, 2])
col = np.array([0, 0, 1, 2, 2, 2])
data = np.array([1, 2, 3, 4, 5, 6]) 
sv = sps.csc_matrix((data, (row, col)), shape=(3, 3))
sv.toarray()
> array([[1, 0, 4],
>       [0, 0, 5],
>       [2, 3, 6]])

type(sv)
<class 'scipy.sparse.csc.csc_matrix'>

#read sv as RDD
sv_rdd = sc.parallelize(sv.toarray())  #transfer saprse to array
sv_rdd.collect()
> [array([1, 0, 4]), array([0, 0, 5]), array([2, 3, 6])]

type(sv_rdd)
> <class 'pyspark.rdd.RDD'>
import numpy as np
import scipy.sparse as sps
from pyspark.mllib.linalg import Matrices

# create a sparse matrix
row = np.array([0, 2, 2, 0, 1, 2])
col = np.array([0, 0, 1, 2, 2, 2])
data = np.array([1, 2, 3, 4, 5, 6]) 
sv = sps.csc_matrix((data, (row, col)), shape=(3, 3))

# convert to pyspark SparseMatrix
sparse_matrix = Matrices.sparse(sv.shape[0],sv.shape[1],sv.indptr,sv.indices,sv.data)