Почему numpy имеет соответствующую функцию для многих методов ndarray?

Несколько примеров:

numpy.sum() ndarray.sum() numpy.amax() ndarray.max() numpy.dot() ndarray.dot() 

… и еще немало. Является ли это поддержкой какого-либо устаревшего кода, или есть ли для этого лучшая причина? И, выбираю ли я только на основе того, как мой код «выглядит», или один из двух способов лучше, чем другой?

Я могу представить, что можно было бы использовать numpy.dot() для использования reduce (например, reduce(numpy.dot, A, B, C, D) ), но я не думаю, что это было бы полезно для чего-то вроде numpy.sum() .

3 Solutions collect form web for “Почему numpy имеет соответствующую функцию для многих методов ndarray?”

Как отмечали другие, одинаково названные функции NumPy и методы массивов часто эквивалентны (они в конечном итоге вызывают один и тот же базовый код). Один может быть предпочтительнее другого, если он упрощает чтение.

Однако в некоторых случаях два ведут себя несколько иначе. В частности, использование метода ndarray иногда подчеркивает тот факт, что метод модифицирует массив на месте.

Например, np.resize возвращает новый массив с указанной формой. С другой стороны, ndarray.resize изменяет форму массива на месте. Значения заполнения, используемые в каждом случае, также различны.

Аналогично, a.sort() сортирует массив a месте, а np.sort(a) возвращает отсортированную копию.

В большинстве случаев метод является базовой скомпилированной версией. Функция использует этот метод, когда он доступен, но также имеет некоторую резервную копию, когда аргумент (ы) не является массивом. Это помогает взглянуть на код и / или документы функции или метода.

Например, если в Ipython я прошу посмотреть код для метода sum, я вижу, что это скомпилированный код

 In [711]: x.sum?? Type: builtin_function_or_method String form: <built-in method sum of numpy.ndarray object at 0xac1bce0> ... Refer to `numpy.sum` for full documentation. 

Сделайте то же самое на np.sum Я получаю много строк документации и код Python:

  if isinstance(a, _gentype): res = _sum_(a) if out is not None: out[...] = res return out return res elif type(a) is not mu.ndarray: try: sum = a.sum except AttributeError: return _methods._sum(a, axis=axis, dtype=dtype, out=out, keepdims=keepdims) # NOTE: Dropping the keepdims parameters here... return sum(axis=axis, dtype=dtype, out=out) else: return _methods._sum(a, axis=axis, dtype=dtype, out=out, keepdims=keepdims) 

Если я вызываю np.sum(x) где x – массив, он заканчивает вызов x.sum() :

  sum = a.sum return sum(axis=axis, dtype=dtype, out=out) 

np.amax аналогичный (но проще). Обратите внимание, что np. form может обрабатывать объект, который не является массивом (который не имеет метода), например список: np.amax([1,2,3]) .

np.dot и x.dot обе показывают как «встроенную» функцию, поэтому мы ничего не можем сказать о приоритете. Они, вероятно, оба в конечном итоге называют некоторые базовые функции C.

np.reshape – это другое, которое делится, если это возможно:

 try: reshape = a.reshape except AttributeError: return _wrapit(a, 'reshape', newshape, order=order) return reshape(newshape, order=order) 

Поэтому np.reshape(x,(2,3)) идентичен по функциональности x.reshape((2,3)) . Но выражение _wrapit позволяет np.reshape([1,2,3,4],(2,2)) .

np.sort возвращает копию, выполнив сортировку np.sort в копии:

 a = asanyarray(a).copy() a.sort(axis, kind, order) return a 

x.resize встроен, а np.resize заканчивает выполнение np.concatenate и np.concatenate reshape .

Если ваш массив является подклассом, например матрицей или замаскированным, он может иметь свой собственный вариант. Действие матрицы .sum :

 return N.ndarray.sum(self, axis, dtype, out, keepdims=True)._collapse(axis) 

Разрабатывая комментарий Петра для видимости:

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

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

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

проблема с numpy: больше согласованности с методами массива # 7452

  • как преобразовать 2d-список в массив 2d numpy?
  • Установка SciPy в экземпляре AWS Tensorflow
  • TypeError: только целые массивы с одним элементом могут быть преобразованы в индекс 3
  • сохранить массив numpy в режиме добавления
  • Numpy Array в base64 и обратно в массив Numpy - Python
  • Создание 4D-представления на 2D-массиве для его разделения на ячейки фиксированного размера
  • Гистограмма Numpy, как взять максимальное значение в каждом ящике
  • Сортировка массивов в NumPy по столбцам
  • Python - лучший язык программирования в мире.