Я получаю TypeError для a + = b, но не b + = a (numpy) - PullRequest
0 голосов
/ 18 октября 2018

почему я получаю TypeError для a += b, но отлично работает для b += a для кода ниже

import numpy as np
a = np.ones((2,3), dtype=int) 
b = np.random.random((2,3))
a += b

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

В сообщении об ошибке указывается подсказка:

TypeError: Невозможно привести вывод ufunc из dtype ('float64') к dtype ('int32') с правилом преобразования same_kind '

a - это массив int32 с, а b - это массив float64 с.Добавление int32 и float64 (неважно, что будет первым) даст float64.Это значение не может быть сохранено в a, но может быть сохранено в b.

Если вы определите a для использования dtype=float, a+=b будет вполне допустимым:

a = np.ones((2,3), dtype=float)
0 голосов
/ 18 октября 2018

Ваша переменная a является массивом с типами int, а ваша переменная b является массивом с типами float.При добавлении b к a он попытается преобразовать эти числа с плавающей точкой в ​​целые числа, что приводит к потере информации.Однако, когда вы делаете это наоборот, вы бросаете целое число в число с плавающей точкой, что совершенно нормально.

0 голосов
/ 18 октября 2018

Сообщить о всей ошибке TypeError!

----> 3 a += b

TypeError: Cannot cast ufunc add output from dtype('float64') to 
   dtype('int64') with casting rule 'same_kind'

a является целым числом dtype, верно?b это число с плавающей запятой.Добавьте число с плавающей точкой и целое число, и результатом будет число с плавающей точкой.Но ожидается, что a+=... поместит это число в a, целочисленный массив.numpy не хочет этого делать.

Но это нормально:

In [3]: a = a + b
In [4]: a
Out[4]: 
array([[1.01407496, 1.96122364, 1.91447533],
       [1.68130058, 1.99773138, 1.50043386]])

Исходный целочисленный массив a теперь заменен массивом с плавающей точкой.Это присвоение уровня Python, когда a+=... пытается изменить исходный массив a (на месте).Различие важно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...