使用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]])
如何使用spark / breeze完成此操作?我尝试使用new DenseVector(2, 2, Array(1,2,3,4)) * DenseVector(2, 4)
失败了。
答案 0 :(得分:3)
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]|
// +--------------+
但它仅对基本转换有用。
答案 1 :(得分:1)
在Breeze中,这是通过特殊广播值*
完成的。
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(*,::)表示"将操作应用于每一行"。标量乘法为:*
,而矩阵/形状乘法为*
。