maps - Zuordnen von Werten aus zwei Arrays in Ruby

Translate

Ich frage mich, ob es eine Möglichkeit gibt, das zu tun, was ich unten mit Python in Ruby tun kann:

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

Ich habe zwei Arrays gleicher Größe mit den Gewichten und Daten, aber ich kann anscheinend keine ähnliche Funktion wie Map in Ruby finden.

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

@ Michael de Mare

Ihr Ruby 1.9-Beispiel kann noch etwas gekürzt werden:

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

Beachten Sie außerdem, dass Sie in Ruby 1.8 Folgendes verwenden können, wenn Sie ActiveSupport (von Rails) benötigen:

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

In Ruby 1.9:

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

In Ruby 1.8:

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

Die Funktion Array.zip führt eine elementweise Kombination von Arrays durch. Es ist nicht ganz so sauber wie die Python-Syntax, aber hier ist ein Ansatz, den Sie verwenden könnten:

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
Quelle
Translate

Ruby hat einemapMethode (auch bekannt als diecollectMethode), die auf jede angewendet werden kannEnumerableObjekt. Wennnumbersist ein Array von Zahlen, die folgende Zeile in Ruby:

numbers.map{|x| x + 5}

ist das Äquivalent der folgenden Zeile in Python:

map(lambda x: x + 5, numbers)

Weitere Einzelheiten finden Sie unterHieroderHier.

Quelle
Translate

Eine Alternative für die Karte, die auch für mehr als 2 Arrays funktioniert:

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}

Dies könnte auch zu Array hinzugefügt werden:

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}
Quelle
Translate
weights = [1,2,3]
data    = [10,50,30]

require 'matrix'
Vector[*weights].inner_product Vector[*data] # => 200 
Quelle
Bisherige:
sql - Timer