Разница между numpy dot() и внутренним()
В чем разница между
import numpy as np
np.dot(a,b)
и
import numpy as np
np.inner(a,b)
все примеры, которые я попробовал, возвратили тот же результат. Wikipedia имеет ту же статью для обоих! В описании inner()
говорится, что его поведение отличается в более высоких измерениях, но я не мог произвести какой-либо другой вывод. Какой из них я должен использовать?
Ответы
Ответ 1
numpy.dot
:
Для двухмерных массивов это эквивалентно матричному умножению, а для 1-D массивов - скалярному произведению векторов (без комплексного сопряжения). Для N измерений это сумма продукта над последней осью a и второй-последним для b:
numpy.inner
:
Обычное скалярное произведение векторов для 1-D массивов (без комплексного сопряжения), в более высоких размерностях - суммарное произведение по последним осям.
(Подчеркните мой.)
В качестве примера рассмотрим этот пример с 2D-массивами:
>>> a=np.array([[1,2],[3,4]])
>>> b=np.array([[11,12],[13,14]])
>>> np.dot(a,b)
array([[37, 40],
[85, 92]])
>>> np.inner(a,b)
array([[35, 41],
[81, 95]])
Таким образом, тот, который вы должны использовать, - это тот, который дает правильное поведение для вашего приложения.
Тестирование производительности
(Обратите внимание, что я тестирую только 1-й случай, так как это единственная ситуация, когда .dot
и .inner
дают тот же результат.)
>>> import timeit
>>> setup = 'import numpy as np; a=np.random.random(1000); b = np.random.random(1000)'
>>> [timeit.timeit('np.dot(a,b)',setup,number=1000000) for _ in range(3)]
[2.6920320987701416, 2.676928997039795, 2.633111000061035]
>>> [timeit.timeit('np.inner(a,b)',setup,number=1000000) for _ in range(3)]
[2.588860034942627, 2.5845699310302734, 2.6556360721588135]
Так что, может быть, .inner
работает быстрее, но моя машина довольно загружена на данный момент, поэтому тайминги несовместимы и не обязательно очень точны.
Ответ 2
np.dot
и np.inner
идентичны для одномерных массивов, поэтому, вероятно, вы не замечаете никаких различий. Для N-мерных массивов они соответствуют общим тензорным операциям.
np.inner
иногда называют "векторным произведением" между тензором высшего и нижнего порядка, в частности, тензорным временем вектора и часто приводит к "тензорному сокращению". Он включает умножение матрицы-вектора.
np.dot
соответствует "тензорному произведению" и включает случай, упомянутый в нижней части страницы Википедии. Он обычно используется для умножения двух аналогичных тензоров для создания нового тензора. Он включает в себя матричное матричное умножение.
Если вы не используете тензоры, вам не нужно беспокоиться об этих случаях, и они ведут себя одинаково.
Ответ 3
Для 1 и 2-мерных массивов numpy.inner работает как транспонированная вторая матрица, затем умножается.
Итак, для:
A = [[a1,b1],[c1,d1]]
B = [[a2,b2],[c2,d2]]
numpy.inner(A,B)
array([[a1*a2 + b1*b2, a1*c2 + b1*d2],
[c1*a2 + d1*b2, c1*c2 + d1*d2])
Я работал с такими примерами, как:
A=[[1 ,10], [100,1000]]
B=[[1,2], [3,4]]
numpy.inner(A,B)
array([[ 21, 43],
[2100, 4300]])
Это также объясняет поведение в одном измерении numpy.inner([a,b],[c,b]) = ac+bd
и numpy.inner([[a],[b]], [[c],[d]]) = [[ac,ad],[bc,bd]]
.
Это объем моих знаний, не знаю, что он делает для более высоких измерений.
Ответ 4
внутренняя не работает должным образом со сложными 2D-массивами, попробуйте умножить
и его транспонирование
array([[ 1.+1.j, 4.+4.j, 7.+7.j],
[ 2.+2.j, 5.+5.j, 8.+8.j],
[ 3.+3.j, 6.+6.j, 9.+9.j]])
вы получите
array([[ 0. +60.j, 0. +72.j, 0. +84.j],
[ 0.+132.j, 0.+162.j, 0.+192.j],
[ 0.+204.j, 0.+252.j, 0.+300.j]])
эффективное умножение строк на строки, а не строки на столбцы
Ответ 5
Существует большая разница между внутренним продуктом и точечным продуктом в пространстве с более высоким пространством. ниже приведен пример матрицы 2x2 и матрицы 3x2
x = [[a1, b1], [c1, d1]]
y = [[a2, b2]. [c2, d2], [e2, f2]
np.inner(x, y)
output = [[a1xa2 + b1xb2, a1xc2 + b1xd2, a1xe2 + b1f2], [c1xa2 + d1xb2, c1xc2 + d1xd2, c1xe2 + d1xf2]]
Но в случае точечного продукта на выходе появляется ошибка ниже, поскольку вы не можете умножить матрицу 2x2 с 3x2.
ValueError: фигуры (2,2) и (3,2) не выровнены: 2 (dim 1)!= 3 (dim 0)
Ответ 6
Я сделал быстрый сценарий, чтобы попрактиковаться в математике внутреннего и точечного продуктов Это действительно помогло мне почувствовать разницу:
![enter image description here]()
Вы можете найти код здесь:
https://github.com/geofflangenderfer/practice_inner_dot