将数据帧列中的元素乘以相同的值



使用pandas/numpy,2x2矩阵乘以2x1矩阵将导致2x2矩阵中的每一列乘以2x1中相应的列值。例:以下为numpy

>>> data = np.array([[1, 2], [3, 4]])
>>> data
array([[1, 2],
       [3, 4]])
>>> data * [2, 4]
array([[ 2,  8],
       [ 6, 16]])

如何在星星之火/轻而易举的情况下完成此操作?我尝试使用new DenseVector(2, 2, Array(1,2,3,4)) * DenseVector(2, 4)失败。

Spark DataFrames不是为线性代数运算而设计的。理论上,您可以使用VectorAssembler组合所有列,并使用ElementwiseProduct:执行乘法运算

import org.apache.spark.ml.feature.ElementwiseProduct
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.ml.feature.VectorAssembler
val assembler = new VectorAssembler()
  .setInputCols(Array("x1", "x2"))
  .setOutputCol("xs")
val product = new ElementwiseProduct()
  .setScalingVec(Vectors.dense(Array(2.0, 4.0)))
  .setInputCol("xs")
  .setOutputCol("xs_transformed")
val df = sc.parallelize(Seq((1.0, 2.0), (3.0, 4.0))).toDF("x1", "x2")
product.transform(assembler.transform(df)).select("xs_transformed").show
// +--------------+
// |xs_transformed|
// +--------------+
// |     [2.0,8.0]|
// |    [6.0,16.0]|
// +--------------+

但它只对基本变换有用。

在微风中,这是通过特殊的广播值*来完成的。

scala> import breeze.linalg._
import breeze.linalg._
scala> val dm = DenseMatrix((1,2), (3,4))
dm: breeze.linalg.DenseMatrix[Int] =
1  2
3  4
scala> dm(*, ::) :* DenseVector(2,4)
res0: breeze.linalg.DenseMatrix[Int] =
2  8
6  16

dm(*,:)表示"将操作应用于每一行"。标量乘法是:*,而矩阵/成形乘法是*

相关内容

  • 没有找到相关文章

最新更新