Leictreonaic
Leictreonaic

Reputation: 1

Type error Python programming

I am trying to write some code for an assignment in python. What I am not finding anywhere is what is wrong and why it will not run. It is sense and move robotic localization function. I do not understand why this line will not work.

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'

Can you suggest anything for what I have here posted?

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

Upvotes: 0

Views: 352

Answers (4)

Silas Ray
Silas Ray

Reputation: 26160

Related to what @Mike said, you could also do:

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)

I like that because it is more concise and doesn't have to build a bunch of ranges every time you call it, and it also reduces the number of times you iterate over the data, but to each their own.

Upvotes: 0

Mike
Mike

Reputation: 20216

As others have pointed out, this p variable is apparently a sequence of sequences. You can verify this by putting

print(type(p))
print(type(p[i]))

before the append statement. You'll probably see something like

tuple
tuple

If that's what you expected, then you'll need to loop over the other index of the array. Also, does your q need to be returned with the same shape? I suspect you want something more like this.

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

Note that you also might want to look into numpy arrays.

Upvotes: 2

krethika
krethika

Reputation: 4496

The problem here is what others have said. You can only multiply a sequence by an int, not a float. For example

>>> [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'

Double check your data type for p, to make sure it is supposed to be a sequence. If that is truly what p should be, then make sure to convert the following to an int before multiplying

(hit * sensor_right + (1 - hit) * (1-sensor_right))

Upvotes: 0

Aaron Dufour
Aaron Dufour

Reputation: 17535

If you're correct about the other variables, it is telling you that p[i] is a sequence (most likely a list), which can't be multiplied by a float. Perhaps p[i] is not what you're expecting it to be?

Try printing p[i] before the line that throws an error.

Upvotes: 0

Related Questions