IT이야기

numpy dot()와 inner()의 차이점

cyworld 2021. 10. 2. 17:53
반응형

numpy dot()와 inner()의 차이점


차이점은 무엇입니까

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

그리고

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

내가 시도한 모든 예는 동일한 결과를 반환했습니다. Wikipedia 에는 둘 다에 대한 동일한 기사가 있습니다?! 에서 설명inner()그것이 말하는 그 행동이 더 높은 차원에서 차이가 있지만, 나는 어떤 다른 출력을 생성 할 수 없습니다. 어느 것을 사용해야 합니까?


numpy.dot:

2차원 배열의 경우 행렬 곱셈과 동일하며 1차원 배열의 경우 벡터의 내적(복소수 켤레 없음)에 해당합니다. N 차원의 경우 b 마지막 축마지막 에서 두 번째 대한 합 입니다.

numpy.inner:

1차원 배열(복소수 켤레 없음)에 대한 벡터의 일반 내적, 고차원에서 마지막 축에 대한 합 입니다.

(나를 강조한다.)

예를 들어 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.inner1차원 배열과 동일하므로 차이점을 눈치채지 못할 수 있습니다. N차원 배열의 경우 일반적인 텐서 연산에 해당합니다.

np.inner때때로 고차 텐서와 저차 텐서 사이의 "벡터 곱", 특히 텐서 곱하기 벡터라고 하며 종종 "텐서 수축"으로 이어집니다. 여기에는 행렬-벡터 곱셈이 포함됩니다.

np.dot"텐서 곱"에 해당하며 Wikipedia 페이지 하단에 언급된 경우를 포함합니다. 일반적으로 두 개의 유사한 텐서를 곱하여 새 텐서를 생성하는 데 사용됩니다. 여기에는 행렬-행렬 곱셈이 포함됩니다.

텐서를 사용하지 않는 경우 이러한 경우에 대해 걱정할 필요가 없으며 동일하게 동작합니다.


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

이것은 또한 1차원에서의 동작을 설명 numpy.inner([a,b],[c,b]) = ac+bd하고 numpy.inner([[a],[b]], [[c],[d]]) = [[ac,ad],[bc,bd]]. 이것은 내 지식의 범위이며 더 높은 차원에서 무엇을 하는지 모릅니다.


내부가 복잡한 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]])

행에서 열로가 아니라 행에서 행으로 효과적으로 곱하기


고차원 공간에서 내적과 내적 사이에는 많은 차이가 있습니다. 아래는 2x2 행렬과 3x2 행렬 x = [[a1,b1],[c1,d1]] y= [[a2,b2].[c2,d2],[e2,f2]의 예입니다.

np.inner(x,y)

출력 = [[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)


내부 및 내적 수학을 연습하기 위해 빠른 스크립트를 만들었습니다. 차이점에 대한 느낌을 얻는 데 정말 도움이 되었습니다.

여기에 이미지 설명 입력

여기에서 코드를 찾을 수 있습니다.

https://github.com/geofflangenderfer/practice_inner_dot

ReferenceURL : https://stackoverflow.com/questions/11033573/difference-between-numpy-dot-and-inner

반응형