从scipy稀疏矩阵创建稀疏RDD

时间:2016-11-17 01:58:08

标签: python numpy apache-spark scipy pyspark

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

关键是它非常稀疏而且我不想爆炸集群 - 我可以将行转换为SparseVectors吗?或者将整个事物转换为SparseMatrix?

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

2 个答案:

答案 0 :(得分:4)

我最近遇到过这个问题 - 我认为您可以通过使用scipy csc_matrix属性构建SparseMatrix来直接转换。 (借用杨布莱恩)

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)

答案 1 :(得分:2)

您唯一需要的是toarray()

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'>