python numpy ValueError: không thể phát các toán hạng cùng với các hình dạng


128

Trong numpy, tôi có hai "mảng", X(m,n)ylà một vectơ(n,1)

sử dụng

X*y

Tôi đang nhận lỗi

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

Khi nào (97,2)x(2,1)rõ ràng là một phép toán ma trận hợp pháp và nên cung cấp cho tôi một (97,1)vectơ

BIÊN TẬP:

Tôi đã sửa lỗi này bằng cách sử dụng X.dot(y)nhưng câu hỏi ban đầu vẫn còn.


2
"Câu hỏi ban đầu" là gì? X*ykhông nên hoạt động (và nó không), nhưng np.dot(X,y)X.dot(y))sẽ hoạt động (và đối với tôi thì chúng làm vậy).
DSM

3
*không phải là phép nhân ma trận cho ndarraycác đối tượng.
user2357112 hỗ trợ Monica

Tôi đã vào cùng một vấn đề khi giải quyết wT * X, khi điều này nên np.dot (WT, X)
Juan Zamora

X * y không yếu tố nhân khôn ngoan
Victor Zuanazzi

Câu trả lời:


92

dotlà phép nhân ma trận, nhưng *thực hiện một cái gì đó khác.

Chúng tôi có hai mảng:

  • X, hình dạng (97,2)
  • y, hình dạng (2,1)

Với mảng Numpy, hoạt động

X * y

được thực hiện theo phần tử, nhưng một hoặc cả hai giá trị có thể được mở rộng theo một hoặc nhiều thứ nguyên để làm cho chúng tương thích. Hoạt động này được gọi là phát sóng. Các thứ nguyên có kích thước là 1 hoặc bị thiếu có thể được sử dụng trong phát sóng.

Trong ví dụ trên, các thứ nguyên không tương thích, bởi vì:

97   2
 2   1

Ở đây có những con số mâu thuẫn trong chiều đầu tiên (97 và 2). Đó là những gì ValueError ở trên đang phàn nàn. Chiều thứ hai sẽ ổn, vì số 1 không mâu thuẫn với bất cứ thứ gì.

Để biết thêm thông tin về các quy tắc phát sóng: http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html

(Xin lưu ý rằng nếu Xythuộc loại numpy.matrix, thì dấu hoa thị có thể được sử dụng làm phép nhân ma trận. Khuyến nghị của tôi là nên tránh xa numpy.matrix, nó có xu hướng phức tạp hơn là đơn giản hóa mọi thứ.)

Các mảng của bạn sẽ ổn numpy.dot; nếu bạn gặp lỗi trên numpy.dot, bạn phải có một số lỗi khác. Nếu hình dạng sai numpy.dot, bạn sẽ có một ngoại lệ khác:

ValueError: matrices are not aligned

Nếu bạn vẫn gặp lỗi này, vui lòng đăng một ví dụ tối thiểu về sự cố. Một ví dụ về phép nhân với các mảng có hình dạng giống như của bạn sẽ thành công:

In [1]: import numpy

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

34

Mỗi tài liệu numpy :

Khi hoạt động trên hai mảng, NumPy sẽ so sánh các hình dạng của chúng theo phần tử. Nó bắt đầu với các kích thước theo sau và hoạt động về phía trước. Hai thứ nguyên tương thích khi:

  • họ bằng nhau, hoặc
  • một trong số họ là 1

Nói cách khác, nếu bạn đang cố nhân hai ma trận (theo nghĩa đại số tuyến tính) thì bạn muốn X.dot(y)nhưng nếu bạn đang cố gắng truyền vô hướng từ ma trận ylên Xthì bạn cần phải thực hiện X * y.T.

Thí dụ:

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

Có thể lỗi không xảy ra trong sản phẩm chấm, nhưng sau đó. Ví dụ, hãy thử cái này

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) sẽ ổn; tuy nhiên np.dot (a, b) * c sai rõ ràng (12x1 X 1x5 = 12x5 không thể nhân với 5x12 nguyên tố) nhưng numpy sẽ cho bạn

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

Lỗi gây hiểu nhầm; tuy nhiên có một vấn đề trên dòng đó.


1
Thông báo lỗi thực sự gây hiểu nhầm, vì điều này dường như xuất hiện khi kích thước ma trận của bạn sai đối với phép nhân khôn ngoan phần tử.
Aung Htet 24/02/19


7

Bạn đang tìm kiếm np.matmul(X, y). Trong Python 3.5+, bạn có thể sử dụng X @ y.


0

Chúng ta có thể tự nhầm lẫn rằng a * b là một dấu chấm.

Nhưng trên thực tế, nó được phát sóng.

Chấm Sản phẩm: a.dot (b)

Phát sóng:

Thuật ngữ phát sóng đề cập đến cách numpy xử lý các mảng với các kích thước khác nhau trong các phép toán số học dẫn đến các ràng buộc nhất định, mảng nhỏ hơn được phát trên mảng lớn hơn để chúng có hình dạng tương thích.

(m, n) + - / * (1, n) → (m, n): hoạt động sẽ được áp dụng cho m hàng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.