Коротко
a += b,a *= 2и другие составные операторы меняют массив на месте: новый массив не создаётся.a = a + bсоздаёт новый массив и переназначает имя; другие ссылки на старый массив его не видят.- У любой ufunc есть
out=— куда записать результат.np.sqrt(a, out=a)— корень на месте. where=вместе сout=меняет только элементы, где условие истинно.- Тип массива при операции на месте не меняется:
int += float— ошибка.
Синтаксис
a += b # на месте, тип a сохраняется
a = a + b # новый массив
np.multiply(a, 2, out=a) # на месте через out
np.add(a, b, out=result) # в заранее созданный массив
np.sqrt(a, out=a, where=a > 0)Параметры
ПараметрЧто делаетПо умолчанию
outмассив для результата; форма должна совпадать с формой результатаNonewhereмаска: где False — out не меняетсяTruecastingкакие преобразования типа разрешены при записи в out'same_kind'Примеры
prices = np.array([100.0, 250.0, 80.0])alias = prices # вторая ссылка на тот же массив
prices = prices * 1.1 # новый массив; alias по-прежнему старый
print(alias)
alias *= 1.1 # на месте: меняется сам массив
aliasВывод
[100. 250. 80.] array([110., 275., 88.])
result = np.empty(3)
np.multiply(prices, 0.9, out=result) # результат записан в готовый массив
resultВывод
array([ 90., 225., 72.])
np.sqrt(prices, out=prices) # на месте для любой ufunc
prices.round(4)Вывод
array([10. , 15.8114, 8.9443])
values = np.array([4.0, -9.0, 16.0])
np.sqrt(values, out=values, where=values > 0) # отрицательные остались как есть
valuesВывод
array([ 2., -9., 4.])
Подводные камни
Целый массив и дробный результат
При += результат записывается в исходный массив его же типа, и NumPy отказывается молча отбрасывать дробную часть.
counts = np.array([1, 2, 3])
counts += 0.5 # результат float не помещается в int-массивОшибка
UFuncTypeError: Cannot cast ufunc 'add' output from dtype('float64') to dtype('int64') with casting rule 'same_kind'counts = np.array([1, 2, 3])
counts = counts + 0.5 # обычное присваивание создаёт float-массив
countsВывод
array([1.5, 2.5, 3.5])
Побочные эффекты через представления
Операция на месте над срезом или над массивом, переданным в функцию, меняет исходные данные — см. представления и копии.