34

On a numpy array, why is it I can successfully use / 2:

>>> a=np.array([2, 4, 6])
>>> a = a / 2
>>> a
array([ 1.,  2.,  3.])

But I cannot use a /= 2?

>>> a=np.array([2, 4, 6])
>>> a /= 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: No loop matching the specified signature and casting
was found for ufunc true_divide

I've seen numpy Issue 6464, but don't understand from reading it and the linked release notes the reason this doesn't work.

Is there any way to get /= to work as expected?

1
  • 10
    Note in the first case the new a is a float. The second isn't allowed to change the dtype. Commented Feb 23, 2018 at 12:55

2 Answers 2

36

As pointed out in the comment, the change from int (which is how a is created) to float (which is the result of /) is not allowed when using /=. To "fix" this the dtype of a just has to be a float from the beginning:

a=np.array([2, 4, 6], dtype=np.float64)
a/=2
print(str(a))
>>>array([1., 2., 3.])
Sign up to request clarification or add additional context in comments.

Comments

14

As mentioned in the comments, a / 2 produces a float array, but the type of a is integer. Since NumPy's assignment operators are optimized to reuse the same array (that is a = a + 2 and a += 2 are not exactly the same, the first creates a new array while the second just reuses the existing one), you can not use them when the result has a different dtype. If what you want is an integer division, you can use the //= assignment operation:

>>> a = np.array([2, 4, 6])
>>> a //= 2
>>> a
array([1, 2, 3])

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.