Ответ 1
Это намеренное.
Оператор +=
сохраняет тип массива. Другими словами, массив целых чисел остается массивом целых чисел.
Это позволяет NumPy выполнять операцию +=
с использованием существующего хранилища массивов. С другой стороны, a=a+b
создает совершенно новый массив для суммы и переупорядочивает a
, чтобы указать на этот новый массив; это увеличивает объем памяти, используемой для операции.
Чтобы процитировать документацию:
Предупреждение: На месте операции будут выполняться вычисления с использованием точности, определяемой типом данных двух операндов, но будет тихо опускать результат (если необходимо), чтобы он мог поместиться обратно в массив, Поэтому для смешанных вычислений точности
A {op}= B
может отличаться отA = A {op} B
. Например, предположимa = ones((3,3))
. Тогдаa += 3j
отличается отa = a + 3j
: в то время как оба они выполняют одно и то же вычисление,a += 3
возвращает результат, чтобы он возвращался вa
, тогда какa = a + 3j
повторно связывает имяa
с результатом.
Наконец, если вам интересно, почему a
был целым массивом в первую очередь, рассмотрите следующее:
In [3]: np.arange(5).dtype
Out[3]: dtype('int64')
In [4]: np.arange(5.0).dtype
Out[4]: dtype('float64')