2013-08-15 27 views
5

Trong phép nhân ma trận, giả sử rằng A là ma trận 3 x 2 (3 hàng, 2 cột) và B là ma trận 2 x 4 (2 hàng, 4 cột), sau đó nếu ma trận C = A * B, sau đó C phải có 3 hàng và 4 cột. Tại sao numpy không làm phép nhân này? Khi tôi thử mã sau, tôi gặp lỗi: ValueError: operands could not be broadcast together with shapes (3,2) (2,4)Hình nhân số ma trận dạng khối

a = np.ones((3,2)) 
b = np.ones((2,4)) 
print a*b 

Tôi cố gắng chuyển đổi A và B và alwasy có cùng câu trả lời. Tại sao? Làm thế nào để làm phép nhân ma trận trong trường hợp này?

Trả lời

15

Toán tử * cho mảng có khối u là nhân tố khôn ngoan (tương tự như sản phẩm Hadamard cho mảng có cùng kích thước), không phải nhân ma trận.

Ví dụ:

>>> a 
array([[0], 
     [1], 
     [2]]) 
>>> b 
array([0, 1, 2]) 
>>> a*b 
array([[0, 0, 0], 
     [0, 1, 2], 
     [0, 2, 4]]) 

Đối với ma trận nhân với mảng NumPy:

>>> a = np.ones((3,2)) 
>>> b = np.ones((2,4)) 
>>> np.dot(a,b) 
array([[ 2., 2., 2., 2.], 
     [ 2., 2., 2., 2.], 
     [ 2., 2., 2., 2.]]) 

Bên cạnh đó bạn có thể sử dụng lớp ma trận:

>>> a=np.matrix(np.ones((3,2))) 
>>> b=np.matrix(np.ones((2,4))) 
>>> a*b 
matrix([[ 2., 2., 2., 2.], 
     [ 2., 2., 2., 2.], 
     [ 2., 2., 2., 2.]]) 

Thông tin thêm về mảng NumPy phát sóng có thể được tìm thấy here và có thể tìm thấy thêm thông tin về lớp ma trận here.

+0

Bạn nên cẩn thận với phần mở rộng narse.linalg numpy xác định lớp "LinearOperator". Trong lớp này, toán tử "*" được hiểu là sản phẩm dấu chấm phẩy thông thường. – Guillaume

+0

khi nào người ta nên sử dụng ma trận và mảng ma trận? Cho đến gần đây tôi thậm chí không biết rằng có một ma trận API. –

+0

@CharlieParker Tôi sẽ không khuyên bạn nên sử dụng ma trận, tôi tin rằng họ được dự kiến ​​sẽ không được chấp nhận. – Daniel