Ma trận Numpy hoàn toàn là 2 chiều, trong khi các mảng numpy (ndarrays) là N chiều. Các đối tượng ma trận là một lớp con của ndarray, vì vậy 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 numpy là chúng cung cấp một 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à sản phẩm ma trận của chúng.
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, kể từ Python 3.5, NumPy hỗ trợ nhân ma trận infix bằng cách sử dụng @
toán tử, do đó bạn có thể đạt được sự thuận tiện tương tự của phép nhân ma trận với các câu lệnh trong Python> = 3.5.
import numpy as np
a = np.array([[4, 3], [2, 1]])
b = np.array([[1, 2], [3, 4]])
print(a@b)
# [[13 20]
# [ 5 8]]
Cả hai đối tượng ma trận và ndarrays đều .T
phải trả về chuyển vị, nhưng các đối tượng ma trận cũng có .H
cho chuyển vị liên hợp và .I
cho nghịch đảo.
Ngược lại, mảng numpy luôn tuân thủ quy tắc rằng các hoạt động được áp dụng phần tử khôn ngoan (ngoại trừ @
toán tử mới ). Do đó, nếu a
và b
là mảng numpy, thì a*b
mảng được hình thành bằng cách nhân các thành phần thành phần 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 @
trong Python> = 3.5, như được hiển thị ở trên):
print(np.dot(c,d))
# [[13 20]
# [ 5 8]]
Các **
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à một ma trận, a**2
trả về sản phẩm ma trận a*a
. Vì c
là một ndarray, c**2
trả về một ndarray với mỗi thành phần bình phương thành phần tử.
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
, lựa chọn vật phẩm và hành vi trình tự).
Ưu điểm chính của mảng numpy 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 ndarray, không phải là một đối tượng ma trận. Do đó, học cách sử dụng các đối tượng ma trận là công việc nhiều hơn - bạn phải học các hoạt động của đối tượng ma trận và các hoạt động ndarray.
Viết một chương trình pha trộn cả ma trận và mảng khiến 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 của mình là gì, nhân lên sẽ trả về thứ bạn không mong đợi.
Ngược lại, nếu bạn chỉ gắn bó với ndarrays, thì bạn có thể làm mọi thứ mà các đối tượng ma trận có thể làm, và hơn thế nữa, ngoại trừ với các hàm / 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 ký hiệu sản phẩm ma trận NumPy (có thể đạt được gần như thanh lịch với các câu lệnh trong Python> = 3.5), thì tôi nghĩ rằng mảng NumPy chắc chắn là hướng đi.
Tái bút Tất nhiên, bạn thực sự không phải chọn cái này với chi phí khác, vì np.asmatrix
và np.asarray
cho phép bạn chuyển đổi cái này sang cái khác (miễn là mảng là 2 chiều).
Có một bản tóm tắt về sự khác biệt giữa NumPy arrays
và NumPy matrix
es ở đây .