如何在pypark 2.2.0中用向量元素乘以矩阵行

时间:2017-11-10 15:22:50

标签: python matrix vector pyspark multiplication

我试图使用pyspark 2.2.0将每个矩阵行乘以给定向量中的相应元素。

例如在numpy我可以这样做:

foo = np.array([[1,2,3], [4,5,6]])
bar = np.array([[2],[3]])
bar * foo

结果:

array([[ 2,  4,  6],
       [12, 15, 18]])

请注意,我不想做点积。它只是将矩阵行中的每个元素乘以向量中的相应元素。

在pyspark 2.2.0中有没有办法做到这一点?我尝试了很多东西,却无法得到我想要的东西。我猜一个人可以用map来做,但不知何故感觉不对。

有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

例如,您可以逐行连接两个数据帧,然后使用UDFArrayType的每个元素乘以IntegerType

首先让我们创建一个带有行索引的数据帧:

foo_df = sc.parallelize(foo.tolist()).zipWithIndex().toDF()
bar_df = sc.parallelize(bar.tolist()).zipWithIndex().toDF()

现在加入他们并获得最终结果:

import pyspark.sql.functions as psf
from pyspark.sql.types import ArrayType, IntegerType
mul = psf.udf(lambda xx,y: [x * y for x in xx], ArrayType(IntegerType()))
foo_df.join(bar_df, '_2')\
    .select(mul(foo_df._1, bar_df._1[0]))\
    .show()

    +-------------------+
    |<lambda>(_1, _1[0])|
    +-------------------+
    |          [2, 4, 6]|
    |       [12, 15, 18]|
    +-------------------+