連想配列 - ruby 配列 結合




Rubyの2つの配列からの値のマッピング (4)

Rubyにはmapメソッド(別名collectメソッド)があり、 Enumerableオブジェクトに適用できEnumerablenumbersnumbersの配列である場合、Rubyの次の行:

numbers.map{|x| x + 5}

Pythonの次の行に相当します:

map(lambda x: x + 5, numbers)

詳細については、 こちらまたはこちらを参照し ください

RubyでPythonで以下のことを行う方法があるかどうかは私には分かります。

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

私は重みとデータと等しいサイズの2つの配列を持っているが、私はRubyでマップに似た関数を見つけることができない、私は働いている削減。


@Michiel de Mare

あなたのRuby 1.9の例は少し短くすることができます:

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

また、Ruby 1.8では、(Railsの)ActiveSupportが必要な場合は、以下を使用することができます:

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

2つ以上の配列でも動作するマップの代替手段:

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}

これは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}

Array.zip関数は配列の要素ごとの組み合わせを行います。 これはPythonの構文と同じくらいきれいではありませんが、使用できるアプローチは次のとおりです。

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






reduce