IT story

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

hot-time 2020. 8. 30. 19:49
반응형

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


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)했지만 원래의 질문은 여전히 ​​남아 있습니다.


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)

데이터 분석을위한 Wes McKinney의 Python

방송 규칙 : 각 후행 차원 (즉, 끝에서 시작)에 대해 축 길이가 일치하거나 길이 중 하나가 1 인 경우 두 개의 배열이 방송용으로 호환됩니다 . 그런 다음 누락 및 / 또는 길이 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]])

It's possible that the error didn't occur in the dot product, but after. For example try this

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) will be fine; however np.dot(a, b) * c is clearly wrong (12x1 X 1x5 = 12x5 which cannot element-wise multiply 5x12) but numpy will give you

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

The error is misleading; however there is an issue on that line.


Use np.mat(x) * np.mat(y), that'll work.

참고URL : https://stackoverflow.com/questions/24560298/python-numpy-valueerror-operands-could-not-be-broadcast-together-with-shapes

반응형