Тип ошибки Python программирования - PullRequest
0 голосов
/ 27 февраля 2012

Я пытаюсь написать код для назначения в Python.Чего я нигде не нахожу, так это того, что не так и почему оно не работает.Это смысл и перемещение роботизированной функции локализации.Я не понимаю, почему эта линия не будет работать.

q.append(p[i] * (hit * sensor_right + (1 - hit) * (1-sensor_right)))
  • hit = сравнение между двумя строками.Это дает значение true или false, которое равно 1 или 0, верно?
  • sensor_right = 0,7
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

Ответы [ 4 ]

2 голосов
/ 27 февраля 2012

Как уже указывали другие, эта 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

Обратите внимание, что вы также можете захотеть взглянуть на пустые массивы.

0 голосов
/ 27 февраля 2012

В связи с тем, что сказал @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)

Мне это нравится, потому что он более лаконичен и не требует построения нескольких диапазонов каждый раз, когда вы вызываете его, а также уменьшает количество повторений данных, но каждый из них свой.

0 голосов
/ 27 февраля 2012

Проблема в том, что сказали другие.Вы можете только умножить последовательность на int, а не на число с плавающей точкой.Например,

>>> [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, то перед умножением

(hit * sensor_right + (1 - hit) * (1-sensor_right))
не забудьте преобразовать следующее в целое число.
0 голосов
/ 27 февраля 2012

Если вы правы в отношении других переменных, это говорит вам, что p[i] - это последовательность (скорее всего, список), которую нельзя умножить на число с плавающей точкой. Возможно, p[i] не то, что вы ожидаете?

Попробуйте print ing p[i] перед строкой, которая выдает ошибку.

...