python numpy ValueError : 피연산자는 셰이프와 함께 브로드 캐스트 할 수 없습니다.


129

numpy에는 두 개의 "배열"이 있으며 Xis (m,n)and yis a vector(n,1)

사용

X*y

오류가 발생합니다

ValueError: operands could not be broadcast together with shapes (97,2) (2,1) 

시는 (97,2)x(2,1)명확하게 법적 매트릭스 작업을하고 나에게 주어야한다 (97,1)벡터

편집하다:

나는 이것을 사용하여 수정 X.dot(y)했지만 원래의 질문은 여전히 ​​남아 있습니다.


2
"원래 질문"은 무엇입니까? X*y작업 (그리고하지 않습니다)하지만 안 np.dot(X,y)하고 X.dot(y))작동합니다 (그리고 나를 위해 그들이 할).
DSM

3
*ndarray객체에 대한 행렬 곱셈이 아닙니다 .
user2357112 모니카 지원

의 빔 형성 * X를 해결 때 같은 문제에있어,이 (의 빔 형성, X) np.dot해야 할 때
후안 자모라

X * Y는 요소 현명한 곱셈을 수행
빅터 Zuanazzi에게

답변:


93

dot행렬 곱셈이지만 *다른 일을합니다.

두 개의 배열이 있습니다.

  • X, 모양 (97,2)
  • y, 모양 (2,1)

Numpy 배열을 사용하면

X * y

요소별로 수행되지만 값 중 하나 또는 둘 모두를 하나 이상의 차원으로 확장하여 호환되도록 할 수 있습니다. 이 작업을 브로드 캐스팅이라고합니다. 크기가 1이거나 누락 된 치수는 방송에 사용할 수 있습니다.

위의 예에서 치수는 다음과 같은 이유로 호환되지 않습니다.

97   2
 2   1

여기에 첫 번째 차원 (97과 2)에 충돌하는 숫자가 있습니다. 그것이 위의 ValueError가 불평하는 것입니다. 두 번째 차원은 1 번이 어떤 것과도 충돌하지 않기 때문에 괜찮습니다.

브로드 캐스팅 규칙에 대한 자세한 정보 : http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html

( Xy유형 numpy.matrix이이면 별표를 행렬 곱셈으로 사용할 수 있습니다. 내 권장 사항은를 멀리 numpy.matrix하는 것입니다. 단순화하는 것보다 더 복잡 해지는 경향이 있습니다.)

당신의 배열은 괜찮을 것입니다 numpy.dot; 에서 오류가 발생 numpy.dot하면 다른 버그가 있어야합니다. 에 대한 모양이 잘못된 경우 numpy.dot다른 예외가 발생합니다.

ValueError: matrices are not aligned

이 오류가 계속 발생하면 문제에 대한 최소한의 예를 게시하십시오. 당신의 것과 같은 모양의 배열을 사용한 예제 곱셈이 성공합니다.

In [1]: import numpy

In [2]: numpy.dot(numpy.ones([97, 2]), numpy.ones([2, 1])).shape
Out[2]: (97, 1)

34

numpy 문서 당 :

두 배열에서 작동 할 때 NumPy는 모양을 요소별로 비교합니다. 후행 치수에서 시작하여 앞으로 나아갑니다. 다음과 같은 경우 두 차원이 호환됩니다.

  • 그들은 같거나
  • 그들 중 하나는 1입니다

즉, 당신이 (선형 대수학 의미에서) 곱셈이 행렬에 시도하는 경우에 당신은 원하는 X.dot(y)하지만 매트릭스에서 방송 스칼라하려고하는 경우 yX당신은 수행해야합니다 X * y.T.

예:

>>> import numpy as np
>>>
>>> X = np.arange(8).reshape(4, 2)
>>> y = np.arange(2).reshape(1, 2)  # create a 1x2 matrix
>>> X * y
array([[0,1],
       [0,3],
       [0,5],
       [0,7]])

11

내적에서 오류가 발생하지 않았지만 이후에 발생할 수 있습니다. 예를 들어 이것을 시도하십시오

a = np.random.randn(12,1)
b = np.random.randn(1,5)
c = np.random.randn(5,12)
d = np.dot(a,b) * c

np.dot (a, b)는 괜찮습니다. 그러나 np.dot (a, b) * c는 분명히 잘못되었지만 (12x1 X 1x5 = 12x5는 요소별로 5x12를 곱할 수 없습니다)하지만 numpy는

ValueError: operands could not be broadcast together with shapes (12,1) (1,5)

오해의 소지가있는 오류입니다. 그러나 그 라인에 문제가 있습니다.


1
요소 별 곱셈에 대해 행렬 차원이 잘못되었을 때 나타나는 것처럼 보이므로 오류 메시지는 실제로 오해의 소지가 있습니다.
Aung Htet 2019


7

을 찾고 있습니다 np.matmul(X, y). Python 3.5 이상에서는 X @ y.


0

우리는 a * b가 내적이라는 것을 혼동 할 수 있습니다.

하지만 실은 방송입니다.

내적 : a.dot (b)

방송:

브로드 캐스팅이라는 용어는 산술 연산 중에 numpy가 다른 차원의 배열을 처리하여 특정 제약 조건을 초래하는 방법을 나타내며, 더 작은 배열은 호환되는 모양을 갖도록 더 큰 배열에 브로드 캐스트됩니다.

(m, n) +-/ * (1, n) → (m, n) : m 행에 적용됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.