Why Doesn't This Throw an Unsupported Operand Error?

Question:

With the code below, I would have expected the X.extend line to throw an unsupported operand error (TypeError: unsupported operand type(s) for +: ‘float’ and ‘list’) since a float is trying to be added to a list. But it runs and gives the same answer as Y.extend, where the entire expression is bracketed as a list. I am using Python 3.10. Now, if you replace the np.cos(fwd_angle) term in X.extend with its actual value (0.5), then python throws the expected error. Why does the initial code work without throwing an error?

import numpy as np

X = [1., 2., 3.]
Y = [1., 2., 3.]
fwd_angle = 60.*np.pi/180.

for i in range(3):
    X.extend( X[i + 1] * np.cos(fwd_angle) + [X[i] + np.sin(fwd_angle)] )
    Y.extend( [Y[i + 1] * np.cos(fwd_angle) + Y[i] + np.sin(fwd_angle)] )

print(X)
print(Y)
Asked By: screenpaver

||

Answers:

np.cos doesn’t return a float value; it returns a numpy.float64 value. These can be added to lists, and the result is a numpy.ndarray value.

numpy.float64.__add__ works by adding the invoking object to each element of an arbitrary iterable:

 # [-1 + 1, -1 + 2, -1 + 3]
 >>> np.cos(np.pi) + [1,2,3]
 array([0., 1., 2.])

(Also, the product of a float and an numpy.float64 value is also a numpy.float64 value.)

Answered By: chepner
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.