pyspark中稀疏矩阵的乘法

pyspark中稀疏矩阵的乘法,pyspark,sparse-matrix,Pyspark,Sparse Matrix,我目前正尝试在Spark中乘以稀疏矩阵(实矩阵非常大)。然而,SparseMatrix类似乎没有transpose或multiply函数,尽管有文档说明它是在线的() 下面是我的代码: 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

我目前正尝试在Spark中乘以稀疏矩阵(实矩阵非常大)。然而,
SparseMatrix
类似乎没有
transpose
multiply
函数,尽管有文档说明它是在线的()

下面是我的代码:

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)

sparse_matrix.transpose()
返回以下错误:

AttributeError: 'SparseMatrix' object has no attribute 'transpose'.
有人知道我为什么会得到
AttributeError
(当我尝试乘法时得到相同的值)吗?pyspark中的矩阵转置/乘法需要很长时间才能开始工作,这真的让我很头疼。

该文档是Java API文档。因为您正在编写Python代码。如您所见,Python版本的
SparseMatrix
中的
transpose
方法不存在。这里的解决方法有点棘手,因为您必须在Python代码中使用Java API,如下面的
sc.\u jvm.org.apache.spark.ml.linalg.SparseMatrix

如果查看Java API文档,则有5个参数:

int numRows
整数
int[]colPtrs//这是java数组基元整数类型
int[]行索引//这是java数组基元整数类型
double[]值//这是java数组基元双类型
我们只需要正确地称之为如下:

从pyspark.mllib.linalg导入SparseMatrix
#用于将Python列表转换为Java数组的helper函数
def to_java_数组(python_列表,java_类型):
java_类=无
如果java_type==“int”:
java_class=sc.\u jvm.int
elif java_type=='double':
java_class=sc.\u jvm.double
其他:
引发错误('不受支持')
java_array=sc._gateway.new_数组(java_类,len(python_列表))
对于范围内的i(len(python_列表)):
java_数组[i]=python_列表[i]
返回java_数组
#我们现在正在创建一个Java矩阵
稀疏矩阵java=sc.\u jvm.org.apache.spark.ml.linalg.SparseMatrix(
sv.shape[0],
sv.形状[1],
到java数组(sv.indptr.tolist(),'int'),
到java数组(sv.index.tolist(),'int'),
to_java_数组([sv.data.tolist()中d的float(d),'double'))
)
#并根据您的意愿进行转换
稀疏矩阵java=稀疏矩阵java.transpose()
#然后将这些值添加回Python矩阵
稀疏矩阵=稀疏矩阵(
稀疏矩阵java.numRows(),
稀疏矩阵java.numCols(),
稀疏矩阵java.colPtrs(),
稀疏矩阵java.rowIndexes(),
稀疏矩阵java.values(),
稀疏矩阵java.isTransposed()
)
#结果
#斯巴达矩阵(3,3,[0,2,3,6],[0,2,2,0,1,2],[1.0,2.0,3.0,4.0,5.0,6.0],真)