我正在尝试用 python 为作业编写一些代码。我在任何地方都找不到问题所在以及它无法运行的原因。它是感知和移动机器人定位功能。我不明白为什么这条线不起作用。
q.append(p[i] * (hit * sensor_right + (1 - hit) * (1-sensor_right)))
Traceback (most recent call last):
File "vm_main.py", line 26, in <module> import main
File "/tmp/sbdxfjuois/main.py", line 50, in <module> p = sense(p, measurements[k])
File "/tmp/sbdxfjuois/main.py", line 34, in sense q.append(p[i] * (hit * sensor_right + (1 - hit) * (1-sensor_right)))
TypeError: can't multiply sequence by non-int of type 'float'
您可以对我在这里发布的内容提出任何建议吗?
def sense(p, Z):
q = [ ]
for i in range(len(p)):
hit = (Z == colors[i])
q.append(p[i] * (hit * sensor_right + (1 - hit) * (1-sensor_right)))
s = sum(q)
for i in range(len(q)):
q[i] = q[i]/s
return q
正如其他人指出的那样,这个
p
变量显然是一个序列序列。您可以通过输入来验证这一点
print(type(p))
print(type(p[i]))
在追加语句之前。你可能会看到类似的东西
tuple
tuple
如果这是您所期望的,那么您将需要循环数组的另一个索引。另外,您的
q
是否需要以相同的形状返回?我怀疑你想要更多类似这样的东西。
def sense(p, Z):
q = p[:]
for i in range(len(p)):
for j in range(len(p[i])):
hit = (Z == colors[i])
q[i][j] = (p[i][j] * (hit * sensor_right + (1 - hit) * (1-sensor_right)))
s = sum(q)
for i in range(len(q)):
q[i] = q[i]/s
return q
请注意,您可能还想研究 numpy 数组。
如果您对其他变量的理解是正确的,那么它告诉您
p[i]
是一个序列(很可能是一个列表),它不能与浮点数相乘。也许p[i]
不是你所期望的那样?
在引发错误的行之前尝试
print
ing p[i]
。
这里的问题是其他人所说的。只能将序列乘以 int,而不能乘以 float。 例如
>>> [1] * 3
[1, 1, 1]
>>> "f" * 6
ffffff
>>> [1] * 0.7
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't multiply sequence by non-int of type 'float'
仔细检查 p 的数据类型,以确保它应该是一个序列。如果这确实是 p 应该是的,那么请确保在相乘之前将以下内容转换为 int
(hit * sensor_right + (1 - hit) * (1-sensor_right))
与@Mike所说的相关,你也可以这样做:
q = []
sum = 0
for i in p:
sub_q = []
for val in i:
computed_val = val * (hit * sensor_right + (1 - hit) * (1-sensor_right))
sum += computed_val
sub_q.append(computed_val)
q.append(sub_q)
我喜欢这一点,因为它更简洁,不必每次调用时都构建一堆范围,而且它还减少了迭代数据的次数,但每个范围都有自己的迭代次数。