Ma trận có khối lượng nghiêm ngặt là 2 chiều, trong khi mảng có nhiều mảng (ndarrays) là N-chiều. Các đối tượng ma trận là một phân lớp của ndarray, do đó, chúng kế thừa tất cả các thuộc tính và phương thức của ndarrays .
Ưu điểm chính của ma trận khó khăn là chúng cung cấp ký hiệu thuận tiện cho phép nhân ma trận: nếu a và b là ma trận, thì a * b là ma trận sản phẩm.
import numpy as np
a=np.mat('4 3; 2 1')
b=np.mat('1 2; 3 4')
print(a)
# [[4 3]
# [2 1]]
print(b)
# [[1 2]
# [3 4]]
print(a*b)
# [[13 20]
# [ 5 8]]
Mặt khác, tính đến Python 3.5, NumPy hỗ trợ ghi vào ma trận nhân sử dụng toán tử @
, vì vậy bạn có thể đạt được sự tiện lợi cùng của phép nhân ma trận với ndarrays bằng Python> = 3.5.
import numpy as np
a=np.array([[4, 3], [2, 1]])
b=np.array([[1, 2], [3, 4]])
print([email protected])
# [[13 20]
# [ 5 8]]
Cả hai đối tượng ma trận và ndarrays có .T
để trả lại chuyển vị, nhưng ma trận đối tượng cũng có .H
cho chuyển vị liên hợp, và .I
cho nghịch đảo.
Ngược lại, mảng cố định luôn tuân theo quy tắc hoạt động là được áp dụng thành phần khôn ngoan (trừ toán tử @
mới). Vì vậy, nếu a
và b
là mảng NumPy, sau đó a*b
là mảng hình thành bằng cách nhân các thành phần nguyên tố khôn ngoan:
c=np.array([[4, 3], [2, 1]])
d=np.array([[1, 2], [3, 4]])
print(c*d)
# [[4 6]
# [6 4]]
Để có được kết quả của phép nhân ma trận, bạn sử dụng np.dot
(hoặc @
bằng Python> = 3.5, như trình bày ở trên):
print(np.dot(c,d))
# [[13 20]
# [ 5 8]]
Nhà điều hành **
cũng cư xử khác nhau:
print(a**2)
# [[22 15]
# [10 7]]
print(c**2)
# [[16 9]
# [ 4 1]]
Vì a
là ma trận, a**2
trả về sản phẩm ma trận a*a
. Vì c
là một số thứ tự, c**2
trả về một dấu sao với mỗi thành phần bình phương yếu tố khôn ngoan.
Có sự khác biệt kỹ thuật khác giữa các đối tượng ma trận và ndarrays (phải làm với np.ravel, chọn mục và hành vi trình tự).
Ưu điểm chính của mảng có nhiều mảng là chúng tổng quát hơn ma trận 2 chiều. Điều gì xảy ra khi bạn muốn một mảng 3 chiều? Sau đó, bạn phải sử dụng một đối tượng ma trận, không phải là ma trận.Vì vậy, việc học sử dụng ma trận đối tượng là công việc nhiều hơn - bạn phải học các hoạt động đối tượng ma trận và các hoạt động ndarray .
Viết chương trình sử dụng cả ma trận và mảng làm cho cuộc sống của bạn trở nên khó khăn vì bạn phải theo dõi loại đối tượng mà biến của bạn đang sử dụng, vì sợ rằng bạn không mong đợi điều gì.
Ngược lại, nếu bạn chỉ gắn bó với các ô, bạn có thể làm mọi thứ đối tượng ma trận có thể thực hiện, và nhiều hơn nữa, ngoại trừ các chức năng/ký hiệu hơi khác nhau .
Nếu bạn sẵn sàng từ bỏ sự hấp dẫn trực quan của sản phẩm ma trận NumPy ký hiệu (có thể đạt được gần như thanh lịch với ndarrays bằng Python> = 3.5), thì tôi nghĩ mảng NumPy chắc chắn là con đường để đi.
PS. Tất nhiên, bạn thực sự không phải chọn một chi phí khác, kể từ np.asmatrix
và np.asarray
cho phép bạn chuyển đổi một cái khác (như miễn là mảng là 2 chiều).
Có một tóm tắt của sự khác biệt giữa NumPy arrays
vs NumPy matrix
es here.
Tôi không có đủ thông tin để biện minh cho câu trả lời nhưng từ những gì tôi có thể cho biết sự khác biệt chính là triển khai phép nhân. Một ma trận thực hiện phép nhân/ma trận tensor, trong khi một mảng sẽ làm phép nhân phần tử. –
Python 3.5 đã thêm toán tử @ infix cho phép nhân ma trận (PEP 465) và NumPy 1.10 hỗ trợ thêm cho nó. Vì vậy, nếu bạn đang sử dụng Python 3.5+ và NumPy 1.10+, thì bạn chỉ có thể viết 'A @ B' thay vì' A.dot (B) ', trong đó' A' và 'B' là 2D' ndarray's. Điều này loại bỏ lợi thế chính của việc sử dụng 'ma trận' thay vì' ndarray' đơn giản, IMHO. – MiniQuark