/ / Używanie Scala Breeze do nadawania w stylu numPy - scala, scalala, scala-breeze

Używanie Scala Breeze do nadawania w stylu numPy - scala, scalala, scala-breeze

Czy istnieje ogólny sposób korzystania z Breeze, aby osiągnąć to, co możesz zrobić za pomocą transmisji w NumPy?

W szczególności, jeśli mam operatora, który chciałbymstosuje się do dwóch macierzy 3x4, mogę zastosować tę operację w sposób elementarny. Mam jednak matrycę 3x4 i 3-elementowy wektor kolumnowy. Chciałbym funkcji, która wytwarza matrycę 3x4 utworzoną z zastosowania operatora do każdego elementu macierzy z elementem z wektora dla odpowiedniego wiersza.

Więc dla podziału:

2 4 6   /  2 3  = 1 2 3
3 6 9             1 2 3

Jeśli to nie jest możliwe, chętnie przyjrzę się jego wdrożeniu.

Odpowiedzi:

3 dla odpowiedzi № 1

Możesz użyć mapPairs, aby osiągnąć to, o czym "myślę", czego szukasz:

  val adder = DenseVector(1, 2, 3, 4)

val result = DenseMatrix.zeros[Int](3, 4).mapPairs({
case ((row, col), value) => {
value + adder(col)
}
})

println(result)

1  2  3  4
1  2  3  4
1  2  3  4

Jestem pewien, że możesz dostosować to, co chcesz, z prostego "addera" powyżej.


1 dla odpowiedzi nr 2

Breeze obsługuje teraz nadawanie tego rodzaju:

scala> val dm = DenseMatrix( (2, 4, 6), (3, 6, 9) )
dm: breeze.linalg.DenseMatrix[Int] =
2  4  6
3  6  9

scala> val dv = DenseVector(2,3)
dv: breeze.linalg.DenseVector[Int] = DenseVector(2, 3)

scala> dm(::, *) :/ dv
res4: breeze.linalg.DenseMatrix[Int] =
1  2  3
1  2  3

The * operator mówi, którą oś ma nadawać. Breeze nie zezwala na dorozumiane nadawanie, z wyjątkiem typów skalarnych.