Есть ли разница между numpy.add(a,b)
и a+b
при добавлении двух ndarrays a и b? В документации указано, что numpy.add
является "Equivalent to x1 + x2 in terms of array broadcasting.". Но я не знаю, что это значит, так как работает numpy.add(numpy.array([1,2,3]),4)
.В чем разница между «numpy.add (a, b)» и «a + b»?
ответ
В синтаксисе 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__
.
Я считаю, что add()
был первым, библиотека улучшилась и получила нормальные математические операторы.
Кстати, мы наблюдаем то же самое сейчас с Python 3.5 и numpy, где матричное умножение может выполняться оператором @
. До этого матричное множество массивов могло быть выполнено только методом dot()
массива.
Вещание означает возможность выполнять операции между массивами разных размеров, например, добавление числа к целому массиву. Это также работает с операторами на массивах.
Добавление числа в массив является лишь крошечным примером возможности вещания. Вы можете узнать больше об этом в Broadcasting Это очень классная функция, которая экономит память и кодирование, но не так просто понять при первом чтении.
- 1. В чем разница между a = a + b и a + = b?
- 2. В чем разница между ['[a, a, a]', '[b, b, b]'] и [[a, a, a], [b, b, b]] в python?
- 3. В чем разница между * (a + b) и (* a + b)
- 4. Разница между a = b и b = a?
- 5. Разница между a - = b и a = a - b в Python
- 6. Perl speed: разница между $ a = $ a. $ B и $ a. = $ B
- 7. Разница между || a = b и a = a || b в рубине?
- 8. Разница между a + = b и a = a + b в Java
- 9. Какая разница между a == b и (a & b) == b
- 10. разница между $ [a-b] и $ ((a-b)) в bash
- 11. В чем разница между // b и int (a/b)?
- 12. В чем разница между [:] = b и a = b [:]
- 13. Разница между $ a = & $ b, $ a = $ b и $ a = clone $ b в PHP OOP
- 14. Разница между a + b и a .__ add __ (b)
- 15. Различия между * a = b и a = & b?
- 16. В чем разница между double a = a + int b и int a + = double b?
- 17. Разница между sort(), sort (function (a, b) {return a-b;}); и sort (function (a, b) {...})
- 18. В чем разница между if (A), если (B) и если (A и B)?
- 19. Разница между [abc] и (a | b | c)
- 20. В чем разница между вспышкой (a, b) и вспышкой(). Put (a, b) в PlayFramework?
- 21. В чем разница между [A, B] и [A; B] в MatLab?
- 22. В чем разница между object.method (a, b) и методом (a, b) в Ruby
- 23. В чем разница между «a is b» и «id (a) == id (b)» в Python?
- 24. В чем разница между var a = b = 2 и var a = 2; var b = 2;
- 25. В чем разница между '(a b c) и (список' a 'b' c)?
- 26. C В чем разница между unsigned int (a)^unsigned int (b) и unsigned int (a^b)?
- 27. В чем разница между x = функцией (a, b, c) {} и функцией x (a, b, c) {}?
- 28. В чем разница между классом A: public virtual B и классом A: public B
- 29. разница между "класса А, класса B" и "класса A :: B"
- 30. SqlAlchemy как запросить столбец A == a и B == b и A == b и B == a
Благодарим вас за подробный ответ. Если я правильно понял, numpy.add быстрее (если можно убедиться, что a и b являются ndarrays), чем a + b, так как это ufunc? – Manu
Тот факт, что один является ufunc, а другой метод, не должен иметь значения в скорости. Это проблема пользовательского интерфейса, а не скорость. Я использую '+', если мне не нужна добавленная функциональность 'add' (например, в' add.reduceat'). – hpaulj