Применение NumPy методов - PullRequest
       7

Применение NumPy методов

0 голосов
/ 03 декабря 2018

Я запутался с тем, как numy методы применяются к nd-массивам.например:

import numpy as np    
a = np.array([[1,2,2],[5,2,3]])
b = a.transpose()
a.sort()

Здесь метод transpose () ничего не меняет на a, но возвращает транспонированную версию a, в то время как метод sort () сортирует a и возвращает NoneType.Кто-нибудь знает, почему это так и какова цель этого другого функционала?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

В классе Python (OOP) методы, которые работают на месте (изменяют self или его атрибуты), являются приемлемыми и, во всяком случае, более распространенными, чем те, которые возвращают новый объект.Это также верно для встроенных классов, таких как dict или list.

Например, в numpy мы часто рекомендуем list append подход к построению нового массива:

In [296]: alist = []
In [297]: for i in range(3):
     ...:     alist.append(i)
     ...:     
In [298]: alist
Out[298]: [0, 1, 2]

Это достаточно часто, чтобы мы могли легко написать его как понимание списка:

In [299]: [i for i in range(3)]
Out[299]: [0, 1, 2]

alist.sort работает на месте, sorted(alist) возвращает новый список.

В numpy методы, которые возвращают новый массив, встречаются гораздо чаще.На самом деле sort - это единственный метод на месте, который я могу придумать не по назначению.Это и прямое изменение shape: arr.shape=(...).

Ряд базовых операций с numpy возвращает view.Это разделяет память данных с источником, но оболочка объекта массива является новой.Фактически, даже индексирование элемента возвращает новый объект.

Поэтому, хотя в конечном итоге вам необходимо проверить документацию, обычно можно предположить, что пустая функция или метод возвращает новый объект, а не работает на месте.

Чаще всего пользователей смущают функции, которые имеют то же имя, что и метод.В большинстве этих случаев функция проверяет, что аргумент (ы) является массивом, а затем делегирует действие своему методу.Также имейте в виду, что в Python операторы переводятся в вызовы методов - от + до __add__, [index] до __getitem__() и т. Д. += является своего рода операцией на месте.

0 голосов
/ 03 декабря 2018

Потому что numpy авторы решили, что некоторые методы будут на месте, а некоторые - нет.Зачем?Я не знаю, сможет ли кто-либо, кроме них, ответить на этот вопрос.

Операции «на месте» потенциально могут быть более быстрыми, особенно при работе с большими массивами, поскольку нет необходимости перераспределять ископируйте весь массив, см. ответы на этот вопрос

Кстати, большинство, если не все arr методы имеют статическую версию, которая возвращает новый массив.Например, arr.sort имеет статическую версию numpy.sort(arr), которая будет принимать массив и возвращать новый отсортированный массив (во многом аналогично глобальной функции sorted и list.sort()).

...