numpy dot()와 inner()의 차이점
차이점은 무엇입니까
import numpy as np
np.dot(a,b)
그리고
import numpy as np
np.inner(a,b)
내가 시도한 모든 예는 동일한 결과를 반환했습니다. Wikipedia 에는 둘 다에 대한 동일한 기사가 있습니다?! 에서 설명 의 inner()
그것이 말하는 그 행동이 더 높은 차원에서 차이가 있지만, 나는 어떤 다른 출력을 생성 할 수 없습니다. 어느 것을 사용해야 합니까?
2차원 배열의 경우 행렬 곱셈과 동일하며 1차원 배열의 경우 벡터의 내적(복소수 켤레 없음)에 해당합니다. N 차원의 경우 b 의 마지막 축 과 마지막 에서 두 번째 축 에 대한 합 입니다.
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.inner
1차원 배열과 동일하므로 차이점을 눈치채지 못할 수 있습니다. 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
'IT이야기' 카테고리의 다른 글
데이터베이스를 mysql에서 mongoDb로 변환 (0) | 2021.10.03 |
---|---|
Visual Studio 2010 확장을 수동으로 제거하는 방법 (0) | 2021.10.02 |
Fortify 소프트웨어는 작동 방법 (0) | 2021.10.02 |
트위터 부트스트랩 드롭다운 메뉴의 z-색인 문제 (0) | 2021.10.02 |
C++11에서 소멸자 뒤에 식별자 재정의 (0) | 2021.10.02 |