将Ruby翻译为Python
我正在把一些代码从Ruby语言重写成Python语言。这段代码是关于一个叫做感知器的东西,具体在聪明算法:自然启发的编程食谱的8.2.6节中提到。我之前从来没有用过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], 等等]
我不太明白这一行:
input_vector = Array.new(num_inputs) {|k| pattern[k].to_f}
这行代码创建了一个包含2个值的数组,每个值|k|
存储的是pattern[k].to_f
,但是pattern[k].to_f
到底是什么呢?
3 个回答
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
中列表的长度少一个,那么你可能根本不需要这个参数。
要小心从一种语言逐行翻译到另一种语言:这样做通常不会得到好的结果,无论涉及到什么语言。
编辑:因为你说你觉得不需要转换成浮点数,所以你可以直接从域值中切出所需数量的元素。我已经相应地更新了我的代码。
2
pattern[k].to_f
将 pattern[k]
转换成一个浮点数。
4
试试这个:
input_vector = [float(pattern[i]) for i in range(num_inputs)]