2016-01-06 2 views
1

С помощью pandas/numpy матрица 2x2, умноженная на матрицу 2x1, приведет к получению каждого столбца в матрице 2x2 соответствующим значением столбца в матрице 2x1. Пример. Следующие с numpyУмножьте элементы в столбце dataframe на одно значение

>>> 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).

+1

Пожалуйста, укажите точный ввод и ожидаемый выход. Похоже, вы смешиваете DataFrames, Breeze Vectors, Spark Vectors ... См. [Как создать минимальный, полный и проверенный пример] (https://stackoverflow.com/help/mcve) – zero323

+0

Хорошо. Я добавил код в numpy. У меня есть Spark Dataframe, но не вижу, как выполнять линейную алгебру на нем, например pandas/numpy, поэтому у меня есть следующий код для преобразования из Dataframe в DenseVector. 'df.map {row => DenseVector (row.toSeq.asInstanceOf [Seq [Double]]: _ *)}' – chargercable

ответ

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

В Бриз это делается с использованием специального значения вещания *.

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 (*,: :) говорит «примените операцию к каждой строке». Скалярное умножение составляет :*, а умножение матрицы/формы - *.

+0

Отличное решение. Он работает со случаем теста, хотя он не выглядит безопасным, когда вектор длиннее строки. Здесь numpy: '>>> data * [1,2,3] Traceback (последний последний звонок): Файл« », строка 1, в ValueError: операнды не могут быть переданы вместе с фигурами (2, 2) (3,). – chargercable

+0

бла, это ошибка. спасибо, что нашел. – dlwh

Смежные вопросы