bidimensionales arreglos ruby maps reduce

arreglos - Asignación de valores de dos matrices en Ruby



arreglos bidimensionales en ruby (6)

Ruby tiene un método de map (también conocido como el método de collect ), que se puede aplicar a cualquier objeto Enumerable . Si los numbers son una matriz de números, la siguiente línea en Ruby:

numbers.map{|x| x + 5}

es el equivalente de la siguiente línea en Python:

map(lambda x: x + 5, numbers)

Para más detalles, mira aquí o aquí .

Me pregunto si hay una manera de hacer lo que puedo hacer a continuación con Python, en Ruby:

sum = reduce(lambda x, y: x + y, map(lambda x, y: x * y, weights, data))

Tengo dos matrices de igual tamaño con los pesos y los datos, pero parece que no puedo encontrar una función similar al mapa en Ruby, reduzco el trabajo.


@Michiel de Mare

Su ejemplo de Ruby 1.9 puede acortarse un poco más:

weights.zip(data).map(:*).reduce(:+)

También tenga en cuenta que en Ruby 1.8, si necesita ActiveSupport (de Rails) puede usar:

weights.zip(data).map(&:*).reduce(&:+)


En Ruby 1.9:

weights.zip(data).map{|a,b| a*b}.reduce(:+)

En Ruby 1.8:

weights.zip(data).inject(0) {|sum,(w,d)| sum + w*d }


Una alternativa para el mapa que también funciona para más de 2 matrices:

def dot(*arrays) arrays.transpose.map {|vals| yield vals} end dot(weights,data) {|a,b| a*b} # OR, if you have a third array dot(weights,data,offsets) {|a,b,c| (a*b)+c}

Esto también podría agregarse a Array:

class Array def dot self.transpose.map{|vals| yield vals} end end [weights,data].dot {|a,b| a*b} #OR [weights,data,offsets].dot {|a,b,c| (a*b)+c}


La función Array.zip hace una combinación de arreglos de elementos. No es tan limpio como la sintaxis de Python, pero este es un enfoque que puede usar:

weights = [1, 2, 3] data = [4, 5, 6] result = Array.new a.zip(b) { |x, y| result << x * y } # For just the one operation sum = 0 a.zip(b) { |x, y| sum += x * y } # For both operations


weights = [1,2,3] data = [10,50,30] require ''matrix'' Vector[*weights].inner_product Vector[*data] # => 200