2016-08-03 6 views

ответ

1

В синтаксисе Python a+b переведен на a.__add__(b). a.__add__ - метод, который реализует добавление для объектов типа a. У числа есть такой метод, список также ([1,3]+[4]), а также строка ('abc'+'d').

numpy реализовал __add__ (и другие стандартные методы __...) для его ndarray класса (по крайней мере для цифровой dtypes).

Это все стандартные Python и numpy и были навеки.

np.add является ufunc. Посмотрите на его документ - см. Параметр out и раздел Binary ufuncs:. Это функция и имеет некоторые методы, такие как reduce, reduceat и т. Д., Что a.__add__+) нет.

Если у вас есть два массива или числа, и вы хотите их суммировать, естественно использовать +, a+b. np.add полезно в некоторых особых случаях

Сравним, например, что происходит с двумя списками:

In [16]: [1,2,3]+[4] 
Out[16]: [1, 2, 3, 4]  # default list concatenation 
In [17]: np.add([1,2,3],[4]) 
Out[17]: array([5, 6, 7]) # convert lists to arrays and sum 

или пример использования 2d вещания:

In [19]: np.add([[1],[2],[3]],[4,1]) 
Out[19]: 
array([[5, 2], 
     [6, 3], 
     [7, 4]]) 
In [20]: np.array([1,2,3])[:,None]+np.array([4,1]) 
Out[20]: 
array([[5, 2], 
     [6, 3], 
     [7, 4]]) 

И ваш пример:

In [21]: numpy.add(numpy.array([1,2,3]),4) 
Out[21]: array([5, 6, 7]) 
In [22]: numpy.array([1,2,3])+4 
Out[22]: array([5, 6, 7]) 

«Эквивалент x1 + x2 в терминах вещания массива». значит, они работают и делают то же самое.

broadcasting - другой вопрос.

==================

@ оператор и np.matmul параллель не совсем то же самое. Оператор @ является недавним дополнением к интерпретатору Python. Он переводится на вызов метода __matmul__ - если он определен. Новые версии numpy имеют такое определение. Но метод не определен для чисел или списков Python. Существует также функциональная версия, np.matmul, ссылающаяся на тот же код. Существует также соединение x.dot и np.dot, но не распознанный Python оператор или x.__dot__.

+0

Благодарим вас за подробный ответ. Если я правильно понял, numpy.add быстрее (если можно убедиться, что a и b являются ndarrays), чем a + b, так как это ufunc? – Manu

+1

Тот факт, что один является ufunc, а другой метод, не должен иметь значения в скорости. Это проблема пользовательского интерфейса, а не скорость. Я использую '+', если мне не нужна добавленная функциональность 'add' (например, в' add.reduceat'). – hpaulj

0

Я считаю, что add() был первым, библиотека улучшилась и получила нормальные математические операторы.

Кстати, мы наблюдаем то же самое сейчас с Python 3.5 и numpy, где матричное умножение может выполняться оператором @. До этого матричное множество массивов могло быть выполнено только методом dot() массива.

Вещание означает возможность выполнять операции между массивами разных размеров, например, добавление числа к целому массиву. Это также работает с операторами на массивах.

Добавление числа в массив является лишь крошечным примером возможности вещания. Вы можете узнать больше об этом в Broadcasting Это очень классная функция, которая экономит память и кодирование, но не так просто понять при первом чтении.

Смежные вопросы