Какие неповоротливые операции копировать, а какие мутировать? - PullRequest
0 голосов
/ 11 ноября 2018

Есть ли общее правило, позволяющее узнать, какие операции над numpy.ndarray производят копию значений и какие их мутируют на месте?

Я довольно новичоки я уверен, что со временем я научусь трудному пути, но мне было интересно, существуют ли общие принципы, способствующие изменчивости, которые могут помочь ускорить мое обучение.

1 Ответ

0 голосов
/ 11 ноября 2018

Функции, которые мутируют на месте

Относительно немногие функции-пустышки видоизменяются на месте. В большинстве случаев функции 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...