【问题标题】:Multiply two numpy matrices in PySpark在 PySpark 中将两个 numpy 矩阵相乘
【发布时间】:2017-03-21 00:51:33
【问题描述】:

假设我有这两个 Numpy 数组:

A = np.arange(1024 ** 2, dtype=np.float64).reshape(1024, 1024)
B = np.arange(1024 ** 2, dtype=np.float64).reshape(1024, 1024)

我对它们执行以下操作:

np.sum(np.dot(A, B))

现在,我希望能够使用 PySpark 使用相同的矩阵执行相同的计算,以便使用我的 Spark 集群实现分布式计算。

有谁知道或有一个在 PySpark 中执行这些操作的示例?

非常感谢您的帮助!

【问题讨论】:

  • 似乎相关labs.yodas.com/…
  • 也许,但不幸的是我无法将该解决方案应用于我的问题。它似乎使用不同的库,是一个基于单词/文本的问题。
  • 那么您的矩阵是密集的还是稀疏的? A 和 B 真的是 1024×1024 还是更大?
  • 感谢您的回复,kennytm。 A & B 可以更大,但 1024x1024 应该适用于我的测试。矩阵的大小真的不是我关心的。此外,这些是 numpy 数组,我相信它们可以很容易地转换为密集矩阵,所以如果需要的话,这样做很好。

标签: python numpy apache-spark pyspark


【解决方案1】:

使用post 中的as_block_matrix 方法,您可以执行以下操作(但请参阅@kennytm 的评论,为什么该方法对于较大的矩阵可能会很慢):

import numpy as np
from pyspark.mllib.linalg.distributed import RowMatrix
A = np.arange(1024 ** 2, dtype=np.float64).reshape(1024, 1024)
B = np.arange(1024 ** 2, dtype=np.float64).reshape(1024, 1024)

from pyspark.mllib.linalg.distributed import *

def as_block_matrix(rdd, rowsPerBlock=1024, colsPerBlock=1024):
    return IndexedRowMatrix(
        rdd.zipWithIndex().map(lambda xi: IndexedRow(xi[1], xi[0]))
    ).toBlockMatrix(rowsPerBlock, colsPerBlock)

matrixA = as_block_matrix(sc.parallelize(A))
matrixB = as_block_matrix(sc.parallelize(B))
product = matrixA.multiply(matrixB)

【讨论】:

    猜你喜欢
    • 2012-08-04
    • 2021-06-06
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    相关资源
    最近更新 更多