将ruby转换为python

时间:2012-01-26 08:39:07

标签: python ruby algorithm translation

我正在将一些代码从Ruby重写为Python。该代码适用于Perceptron的8.2.6部分中列出的Clever Algorithms: Nature-Inspired Programming Recipes。我以前从未使用过Ruby而且我不理解这一部分:

def test_weights(weights, domain, num_inputs)
  correct = 0
  domain.each do |pattern|
    input_vector = Array.new(num_inputs) {|k| pattern[k].to_f}
    output = get_output(weights, input_vector)
    correct += 1 if output.round == pattern.last
  end
  return correct
end

一些解释:num_inputs是一个整数(在我的情况下为2),domain是一个数组列表:[[1,0,1], [0,0,0], etc.]

我不明白这一行:

input_vector = Array.new(num_inputs) {|k| pattern[k].to_f}

它会创建一个包含2个值的数组,每个值|k|存储pattern[k].to_f,但什么是pattern[k].to_f

3 个答案:

答案 0 :(得分:4)

试试这个:

input_vector = [float(pattern[i]) for i in range(num_inputs)]

答案 1 :(得分:2)

pattern[k].to_f

pattern[k]转换为浮点数。

答案 2 :(得分:0)

我不是Ruby专家,但我认为在Python中它会是这样的:

def test_weights(weights, domain, num_inputs):
    correct = 0
    for pattern in domain:
        output = get_output(weights, pattern[:num_inputs])
        if round(output) == pattern[-1]:
            correct += 1
    return correct

有足够的空间来优化这一点:如果num_inputs总是比domain中列表的长度少一个,那么您可能根本不需要该参数。

小心从一种语言到另一种语言的逐行翻译:无论涉及何种语言,都不会产生良好的结果。

编辑,因为您说您不认为需要转换为浮动,您只需从域值中切割所需数量的元素即可。我相应地更新了我的代码。