रूबी में दो सरणी से मान मैपिंग

मैं सोच रहा हूं कि रूबी में पाइथन के साथ मैं क्या कर सकता हूं, ऐसा करने का कोई तरीका है:

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

मेरे वजन और डेटा के बराबर आकार के दो सरणी हैं लेकिन मुझे रूबी में मानचित्र के समान फ़ंक्शन नहीं मिल रहा है, मैं काम कर रहा हूं।

0
जोड़ा संपादित
विचारों: 1

6 उत्तर

रूबी 1.9 में:

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

रूबी 1.8 में:

weights.zip(data).inject(0) {|sum,(w,d)| sum + w*d }
0
जोड़ा
weights = [1,2,3]
data    = [10,50,30]

require 'matrix'
Vector[*weights].inner_product Vector[*data] # => 200 
0
जोड़ा

@ मिचिल डी मारे

आपका रूबी 1.9 उदाहरण थोड़ा और छोटा किया जा सकता है:

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

यह भी ध्यान रखें कि रूबी 1.8 में, यदि आपको ActiveSupport (रेल से) की आवश्यकता है तो आप इसका उपयोग कर सकते हैं:

weights.zip(data).map(&:*).reduce(&:+)
0
जोड़ा
@FelixRabe: ऐसा लगता है कि रूबी ने बदल दिया है इस तरह की proc में तर्क कैसे संभाला जाता है। मुझे वास्तव में कोई विवरण नहीं पता है, क्योंकि मैंने कुछ सालों में रूबी को छुआ नहीं है।
जोड़ा लेखक Kevin Ballard, स्रोत
यह रूबी 1.9.3 (ArgumentError) पर मेरे लिए काम नहीं करता है: [1,2,3] .zip ([4,5,6])। नक्शा (: *)
जोड़ा लेखक Felix Rabe, स्रोत

रुबी में map विधि (a.k.a. संग्रह विधि) है, जिसे किसी भी संख्यात्मक ऑब्जेक्ट पर लागू किया जा सकता है। यदि संख्या संख्याओं की एक सरणी है, तो रूबी में निम्न पंक्ति:

numbers.map{|x| x + 5}

पायथन में निम्न पंक्ति के बराबर है:

map(lambda x: x + 5, numbers)

अधिक जानकारी के लिए, यहां या यहां

0
जोड़ा

Array.zip फ़ंक्शन सरणी के तत्वों का संयोजन करता है। यह पाइथन सिंटैक्स के रूप में काफी साफ नहीं है, लेकिन यहां एक दृष्टिकोण है जिसका आप उपयोग कर सकते हैं:

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
0
जोड़ा

मानचित्र के लिए एक विकल्प जो 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}

इसे ऐरे में भी जोड़ा जा सकता है:

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}
0
जोड़ा