Функции, которые мутируют на месте
Относительно немногие функции-пустышки видоизменяются на месте. В большинстве случаев функции numpy возвращают представления массива, когда могут, и копируют, когда не могут.
Вот полный список (от документов ) функций / методов, которые изменяются на месте:
ndarray.resize
ndarray.sort
- Все арифметические операторы на месте (например,
+=
, *=
, /=
и т. Д.)
numpy.fill_diagonal
numpy.random.shuffle
ndarray.partition
и вот список функций / методов, которые могут изменяться на месте:
ndarray.byteswap
numpy.nan_to_num
Некоторые назначения также изменят массив на месте. Вы можете изменить значения в массиве, присвоив срезу (например, arr[...] = 1
установит каждое значение в массиве на 1
), и вы можете изменить форму массива, назначив новую форму непосредственно .shape
, например arr.shape = (2,3)
(не всегда работает, см. Примечания здесь ).
Есть также некоторые функции, которые поддерживают ключевое слово out
arg. Эти функции будут работать как мутаторы, если вы передадите тот же массив, что и input, и out
.
Честное предупреждение, возможно, я пропустил одного или двух мутаторов, которые не были четко обозначены в документах. В любом случае, список короткий, поэтому запоминать особо нечего.
Примечания о просмотре и копировании возвращаемых значений
Одной из целей разработчиков NumPy за последние несколько лет, по-видимому, было сделать так, чтобы для NUMPY-функций и методов ndarray
стало более распространенным возвращать представления вместо копий. На этом этапе достаточно безопасно предположить, что если функция / метод numpie может вернуть представление, то это будет сделано по умолчанию.
Например, ndarray.flatten
и ndarray.ravel
делают одно и то же (возвращает уплощенный массив). Тем не менее, документы для ndarray.flatten
явно говорят, что он вернет копию, тогда как документы для ndarray.ravel
говорят, что он вернет копию только в случае крайней необходимости.
В живом коде, как правило, всегда можно проверить, произвела ли операция представление или копию, сравнив id
из .base
вашего результата с id
исходного массива. Например:
arr = np.array([[1, 2],
[3, 4],
[5, 6]])
arrflat = arr.flatten()
assert arrflat.base is not arr
arrravel = arr.ravel()
assert arrravel.base is arr