Programming

numpy 행렬 벡터 곱셈

procodes 2020. 6. 3. 22:35
반응형

numpy 행렬 벡터 곱셈


이 질문에는 이미 답변이 있습니다.

두 개의 numpy 배열 크기 (nxn) * (nx 1)를 곱하면 크기 (nxn)의 행렬이 나타납니다. 일반적인 행렬 곱셈 규칙에 따라 (nx 1) 벡터가 예상되지만 Python의 Numpy 모듈에서 이것이 어떻게 수행되는지에 대한 정보를 찾을 수 없습니다.문제는 프로그램 속도를 유지하기 위해 수동으로 구현하고 싶지 않다는 것입니다.예제 코드는 다음과 같습니다.

a = np.array([[ 5, 1 ,3], [ 1, 1 ,1], [ 1, 2 ,1]])
b = np.array([1, 2, 3])

print a*b
   >>
   [[5 2 9]
   [1 2 3]
   [1 4 3]]

내가 원하는 것은 :

print a*b
   >>
   [16 6 8]

가장 간단한 솔루션

 

numpy.dot

또는을 사용하십시오

a.dot(b)

.

여기

에서 설명서를 참조 하십시오 .

>>> a = np.array([[ 5, 1 ,3], 
                  [ 1, 1 ,1], 
                  [ 1, 2 ,1]])
>>> b = np.array([1, 2, 3])
>>> print a.dot(b)
array([16, 6, 8])

이것은 numpy 배열이 행렬이 아니고 표준 작업이

*, +, -, /

배열에서 요소별로 작동 하기 때문에 발생 합니다. 대신 사용하여 시도 할 수

numpy.matrix

*

행렬 곱셈과 같이 처리됩니다.


다른 솔루션

다른 옵션도 있습니다.

  • 아래에서 언급했듯이 python3.5 이상을 사용하면

    @

    연산자가 예상대로 작동합니다.
    >>> print(a @ b)
    array([16, 6, 8])
    
  • 과잉을 원하면을 사용할 수 있습니다

    numpy.einsum

    . 이 문서는 작동 방식에 대한 풍미를 제공하지만 솔직히이

    답변을

    읽고 내 자신 만 가지고 놀기 전까지는 사용법을 완전히 이해하지 못했습니다 .
    >>> np.einsum('ji,i->j', a, b)
    array([16, 6, 8])
    
  • 중반 2016 (NumPy와 1.10.1)의, 당신은 실험적인 시도 할 수 있습니다

    numpy.matmul

    처럼 작동,

    numpy.dot

    두 가지 예외를 제외하고 : 어떤 스칼라 곱셈을하지만, 행렬 스택과 함께 작동합니다.
    >>> np.matmul(a, b)
    array([16, 6, 8])
    
  • numpy.inner

    numpy.dot 는 행렬-벡터 곱셈

    과 같은 방식으로 기능 하지만 행렬-행렬과 텐서 곱셈에서는 다르게 동작

    합니다 (

    일반적으로 내부 제품과 내적 곱 의 차이점에 대해서는 Wikipedia를

    참조

    하거나 numpy의 구현에 대해서는 SO 답변 참조 ).
    >>> np.inner(a, b)
    array([16, 6, 8])
    
    # Beware using for matrix-matrix multiplication though!
    >>> b = a.T
    >>> np.dot(a, b)
    array([[35,  9, 10],
           [ 9,  3,  4],
           [10,  4,  6]])
    >>> np.inner(a, b) 
    array([[29, 12, 19],
           [ 7,  4,  5],
           [ 8,  5,  6]])
    

엣지 케이스를위한 더 큰 옵션

  • 텐서가있는 경우 (차원의 배열이 1 이상인 경우)

    numpy.tensordot

    선택적 인수와 함께 사용할 수 있습니다

    axes=1

    .
    >>> np.tensordot(a, b, axes=1)
    array([16,  6,  8])
    
  • numpy.vdot

    행렬이 1D 배열로 평탄화되므로 복소수 행렬이있는 경우 사용하지 마십시오 . 평행 행렬과 벡터 사이의 복소수 복소수 곱을 찾으려고 시도합니다 (크기 불일치로 인해 실패합니다)

    n*m

    vs

    n

    ).

참고URL : https://stackoverflow.com/questions/21562986/numpy-matrix-vector-multiplication

반응형