在PySpark中转置一个RowMatrix

4

您好,我想知道如何在PySpark中转置RowMatrix。

data = [(MLLibVectors.dense([1.0, 2.0]), ), (MLLibVectors.dense([3.0, 4.0]), )]

df=sqlContext.createDataFrame(data, ["features"])
features=df.select("features").rdd.map(lambda row: row[0])

mat=RowMatrix(features)
print mat.rows.first()
#[1.0,2.0]

mat=mat.Transpose()

print mat.rows.first()
#[1.0,3.0]

有人在Python中实现过吗?我看到了类似的帖子,但是所有内容都是用Scala编写的。谢谢。

1个回答

5

RowMatrix 没有 transpose 方法。您可能需要使用 BlockMatrixCoordinateMatrix


from pyspark.mllib.linalg.distributed import CoordinateMatrix, MatrixEntry

cm = CoordinateMatrix(
    mat.rows.zipWithIndex().flatMap(
        lambda x: [MatrixEntry(x[1], j, v) for j, v in enumerate(x[0])]
    )
)

cm.toRowMatrix().rows.first().toArray()
# array([ 1.,  2.])

cm.transpose().toRowMatrix().rows.first().toArray()
# array([ 1.,  3.])

有趣,感谢您的帮助。我会采用这种方法,如果我找到另一种方法(我已经尝试从Scala代码转换到Python,但没有好运气,如果我看到其他东西,我会发布)。 - Patrick Ruff
1
代码运行得非常好,但我发现这个操作只在单个核心上进行。有没有办法将其并行化,以便在集群中的所有节点上运行? - Nikhil Baby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接