Разница между numy dot() и inner()

В чем разница между

import numpy as np
np.dot(a,b)

а также

import numpy as np
np.inner(a,b)

все примеры, которые я пробовал, возвращали один и тот же результат. В Википедии есть одна и та же статья для обоих?! В описании inner() это говорит, что его поведение отличается в более высоких измерениях, но я не мог произвести различный вывод. Какой я должен использовать?

5 ответов

Решение

numpy.dot:

Для двумерных массивов это эквивалентно умножению матриц, а для одномерных массивов - на внутреннее произведение векторов (без комплексного сопряжения). Для N измерений это сумма произведений по последней оси a и второй по длине b:

numpy.inner:

Обычное внутреннее произведение векторов для одномерных массивов (без комплексного сопряжения), в более высоких измерениях это сумма произведений по последним осям.

(Акцент мой.)

В качестве примера рассмотрим этот пример с 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]])

Таким образом, вы должны использовать тот, который дает правильное поведение для вашего приложения.


Тестирование производительности

(Обратите внимание, что я тестирую только 1D случай, так как это единственная ситуация, когда .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 быстрее, но моя машина в настоящий момент достаточно загружена, так что время не является постоянным и не обязательно очень точным.

np.dot а также np.inner идентичны для одномерных массивов, поэтому, вероятно, вы не замечаете никаких различий. Для массивов N-размерности они соответствуют обычным тензорным операциям.

np.inner иногда называется "векторным произведением" между тензором высшего и низшего порядка, в частности, тензорным умножением на вектор, и часто приводит к "тензорному сжатию". Включает умножение матрицы на вектор.

np.dot соответствует "тензорному произведению" и включает случай, упомянутый внизу страницы Википедии. Обычно он используется для умножения двух одинаковых тензоров для получения нового тензора. Включает матрично-матричное умножение.

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

Для 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]], Это степень моего знания, понятия не имею, что он делает для более высоких измерений.

Внутренняя не работает должным образом со сложными двумерными массивами, попробуйте умножить

и его транспонировать

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]])

эффективно умножать строки на строки, а не строки на столбцы

Существует большая разница между внутренним продуктом и точечным продуктом в пространстве более высокого измерения. ниже приведен пример матрицы 2x2 и матрицы 3x2 x = [[a1, b1], [c1, d1]] y = [[a2, b2]. [c2, d2], [e2, f2]

np.inner (х, у)

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)

Я сделал быстрый сценарий, чтобы попрактиковаться в математике внутри и точечного продукта. Это действительно помогло мне почувствовать разницу:

ht tps://st ackru.com/images/25891b7582eb9003e33da64bcaa4acec482c7351.png

Вы можете найти код здесь:

ht tps://github.com/geofflangenderfer/practice_inner_dot

Проще говоря, np.dot дает матричное умножение () где np.inner дает тензорное произведение ()

Другие вопросы по тегам