2016-11-17 6 views
2

У меня есть большая разреженная матрица из scipy (300k x 100k со всеми двоичными значениями, в основном нулями). Я хотел бы установить строки этой матрицы как RDD, а затем выполнить некоторые вычисления в этих строках - оценить функцию в каждой строке, оценить функции на парах строк и т. Д.Создайте разреженный RDD из scipy разреженной матрицы

Главное, что это довольно редкий и я не хочу взорвать кластер - могу ли я преобразовать строки в SparseVectors? Или, возможно, перевести все это на SparseMatrix?

Можете привести пример, где вы читаете в разреженном массиве, устанавливаете строки в RDD и вычисляете что-то из декартова продукта этих строк?

+0

Попробуйте использовать [pyspark] (https://spark.apache.org/docs/latest/api/python/pyspark.mllib.html?highlight=sparsematrix#pyspark.mllib. linalg.SparseMatrix). –

+0

@EliSadoff Я использую pyspark, проблема в том, что я не знаю, какие объекты использовать или как их настроить. – cgreen

+0

А, я этого не осознавал. Я думал, вы пытаетесь понять, как получить его от python до scala. –

ответ

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

Правильно, но делает ли это кодирование строк как разреженных векторов? – cgreen

+0

Я так не думаю. После 'toarray()', он стал ndarray. –

+0

Я забочусь о том, что сохранение его как плотного массива в каждой записи RDD является пустой тратой пространства - могу ли я автоматически преобразовать scipy разреженную матрицу в один из разреженных классов хранения в PySpark? – cgreen

2

Я имел этот вопрос в последнее время - я думаю, что вы можете конвертировать непосредственно путем построения разреженной матрицы с SciPy атрибутов csc_matrix. (Заимствуя Yang Bryan)

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) 
Смежные вопросы