Вопрос по numpy, python – Почему Numpy по-разному относится к a + = b и a = a + b
The+=
ператор @ сохраняет тип массива. Другими словами, массив целых остается массивом целых чисел.
Это позволяет 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')
@ Экс полностью прав.. Например
>>> a = []
>>> b = a
>>> a += [1]
>>> print a
[1]
>>> print b
[1]
>>> a = a + [2]
>>> print a
[1, 2]
>>> print b
[1]
Как вы видете+=
изменяет список и+
создает новый список. Это верно и для NumPy.+
создает новый массив, поэтому он может быть любого типа данных.+=
изменяет массив на месте, и это непрактично, и не желательно, чтобы numpy изменял тип данных массива при изменении содержимого массива.