2012-05-24 5 views

ответ

41

Это намеренно.

Оператор += сохраняет тип массива. Другими словами, массив целых чисел остается массивом целых чисел.

Это позволяет NumPy выполнять операцию += с использованием существующего хранилища массивов. С другой стороны, a=a+b создает новый массив для суммы и восстанавливает a, чтобы указать на этот новый массив; это увеличивает объем памяти, используемой для операции.

Цитирую documentation:

Предупреждение: На месте операции будет выполнять вычисления с использованием точности решается типом данных двух операндов, но беззвучно обратное приведение результата (при необходимости), так он может поместиться обратно в массив. Поэтому для смешанных прецизионных расчетов 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') 
+0

Я понимаю, что a является целым числом, однако ожидаемый результат в Python добавления float и integers является поплавком, так что это неожиданная «функция» – Dhara

+4

@Dhara: Я согласен, что это может быть неожиданно, когда впервые встретились , Это также может быть полезно. Во всяком случае, я добавил цитату из документации, которая объясняет поведение. – NPE

+0

Операции на месте могут быть намного быстрее (без распределения, лучшего использования кеша), и если вы можете сохранить все существующие ссылки на этот массив (если у вас есть волосатые структуры данных). Также они очень полезны для программистов из фонов C/C++/Fortran. –

8

@aix совершенно прав. Я просто хотел указать, что это не уникально для numpy. Например:

>>> a = [] 
>>> b = a 
>>> a += [1] 
>>> print a 
[1] 
>>> print b 
[1] 
>>> a = a + [2] 
>>> print a 
[1, 2] 
>>> print b 
[1] 

Как вы можете видеть += изменяет список и + создает новый список. Это значение также имеет значение numpy. + создает новый массив, поэтому он может быть любым типом данных. += изменяет массив inplace, и это непрактично, и желательно, для numpy для изменения типа данных массива при изменении содержимого массива.

+0

Хорошая точка, спасибо – Dhara

Смежные вопросы