Tất cả các bài tập trong bài viết này có thể được thực hiện trực tiếp trên trình duyệt qua trang web FundaML
2.1. Khởi tạo một ma trận 2.2. Ma trận đơn vị và ma trận đường chéo 2.4. Truy cập vào từng phần tử của ma trận 2.4.1. Truy cập vào từng phần tử 2.5. Truy cập vào nhiều phần tử của ma trận 2.6. np.sum, np.min, np.max, np.mean cho mảng nhiều chiều 2.7. Các phép toán tác động đến mọi phần tử của ma trận 2.9. Chuyện vị ma trận, Reshape ma trận 2.11. Tích giữa hai ma trận, tích giữa ma trận và vector
2.0. Mảng nhiều chiều
Trong Numpy, người ta thường dùng mảng numpy hai chiều để thể hiện một ma trận. Mảng hai chiều có thể coi là một mảng của các mảng một chiều. Trong đó, mỗi mảng nhỏ một chiều tương ứng với một hàng của ma trận.
Bạn đang xem: Zero mean là gì
Nói cách khác, ma trận có thể được coi là mảng của các vector hàng – mỗi vector hàng được biểu diễn bằng một mảng numpy một chiều.
Ví dụ, nếu một mảng numpy hai chiều a mô tả ma trận:(left
array(, >)Ở đây chúng ta có thể nhìn thấy ba mảng, mỗi mảng được thể hiện bằng một cặp đóng mở ngoặc vuông :
hai mảng và thể hiện các hàng của ma trận. Chúng là các mảng một chiều.
mảng , > có hai phân tử, mỗi phần tử là một hàng của ma trận.
Theo quy ước của Numpy, chúng ta cần đi từ mảng ngoài cùng tới các mảng trong:
mảng lớn nhất là , > được coi là mảng ứng với axis = 0. Trong mảng này, thành phần thứ nhất là , thành phần thứ hai là .
hai mảng lớn thứ hai là và được coi là các mảng ứng với axis = 1.
Chú ý:
Một mảng numpy hoàn toàn có thể có nhiều hơn hai chiều. Khi đó ta vẫn đi từ cặp ngoặc vuông ngoài cùng vào tới trong cùng, axis cũng đi từ 0, 1, … theo thứ tự đó.
Mỗi mảng con phải có số phần tử bằng nhau, thể hiện cho việc mỗi hàng của ma trận phải có số chiều như nhau, không có hàng nào thò ra thụt vào.
Khi làm việc với các thư viện cho Machine Learning, mỗi điểm dữ liệu thường được coi là một mảng một chiều. Tập hợp các điểm dữ liệu thường được lưu trong một ma trận – tức mảng của các mảng một chiều. Trong ma trận này, mỗi hàng tương ứng với một điểm dữ liệu.
Việc này hơi ngược với cách xây dựng toán học của các thuật toán, nơi mà mỗi điểm dữ liệu thường được coi là một vector cột – tức mỗi cột của ma trận là một điểm dữ liệu. Khi đọc các tài liệu và làm việc với các thư viện, bạn đọc cần chú ý.
Giống như bài “Cơ bản về vector”, trong bài học này, chúng ta sẽ cùng làm quen với các cách xử lý ma trận trong Numpy: Khởi tạo, truy cập, thay đổi, ma trận đặc biệt, …
2.1. Khởi tạo một ma trận
2.1.1. Khởi tạo một ma trận
Cách đơn giản nhất để khởi tạo một ma trận là nhập vào từng phần tử của ma trận đó. Cách làm này, tất nhiên, chỉ phù hợp với các ma trận nhỏ.
Nếu bạn mới chuyển từ Matlab qua Python, bạn sẽ thấy cách khai báo của Matlab dễ chịu hơn rất nhiều. Chúng ta sẽ phải quen dần thôi :).
Khi khai báo một mảng numpy nói chung, nếu ít nhất một phần tử của mảng là float, type của mọi phần tử trong mảng sẽ được coi là “numpy.float64” (số thực 64 bit).
Ngược lại, nếu toàn bộ các phần tử là số nguyên (không có dấu . xuất hiện),type của mọi phần tử trong mảng sẽ được coi là “numpy.int64” (số nguyên 64 bit).
Nếu muốn chỉ định type của các phần tử trong mảng, ta cần đặt giá trị cho dtype. Ví dụ:
Bài tập:
Khai báo một mảng numpy hai chiều A mô tả ma trận:
2.2. Ma trận đơn vị và ma trận đường chéo
2.2.1. Ma trận đơn vị
Để tạo một ma trận đơn vị có số chiều bằng n (ma trận đơn vị là một ma trận vuông có tất cả các phần tử trên đường chéo bằng 1), chúng ta sử dụng hàm np.eye():
Hàm np.eye() cũng được dùng để tạo các ma trận toàn 1 ở một đường chéo phụ nào đó, các thành phần còn lại bằng 0. Ví dụ:k = 1 sẽ tương ứng với đường chéo phụ ngay trên đường chéo chíh. k = -2 sẽ tương ứng với đường chéo phụ thứ hai bên dưới đường chéo chính.
Bạn đọc có thể đọc thêm về cách sử dụng hàm ‘np.eye()’ tại đây.
Xin nhắc lại rằng bạn đọc luôn có thể xem cách sử dụng một hàm trên terminal bằng cách gõ help(func) trong đó func là tên hàm bạn muốn tra cứu. Ví dụ, help(np.eye).
2.2.2. Ma trận đường chéo
Để khai báo một ma trận đường chéo, hoặc muốn trích xuất đường chéo của một ma trận, ta dùng hàm np.diag.
Nếu đầu vào là một mảng một chiều, trả về một mảng hai chiều thể hiện ma trận có đường chéo là các phần tử thuộc mảng đó.
Nếu đầu vào là một mảng hai chiều (có thể không vuông), trả về mảng một chiều chứa các giá trị ở hàng thứ i, cột thứ i với 0 . Trong đó m, n lần lượt là số hàng và số cột của ma trận được biểu diễn bằng mảng hai chiều ban đầu.
Đường chéo phụ của một ma trận cũng có thể được lấy bằng cách sử dụng hàm này và chỉ ra giá trị của k:
Bài tập:
Với một số tự nhiên n, hãy viết hàm trả về ma trận có dạng:
2.3. Kích thước của ma trận
Giống như cách tìm kích thước của mảng một chiểu, để tìm kích thước của mảng hai chiều, ta cũng sử dụng thuộc tính shape:
Ở đây, kết quả trả về là một tuple. Số phần tử của tuple này chính là số chiều của mảng. Nếu coi mảng hai chiều như ma trận, số hàng và số cột của ma trận có thể được tính bằng:Với mảng numpy nhiều chiều, ta cũng dùng thuộc tính shape để tìm kích thước của mỗi chiều.
2.4. Truy cập vào từng phần tử của ma trận
2.4.1. Truy cập vào từng phần tử
Có hai cách để truy cập vào mỗi phần tử của mảng hai chiều:
2.4.1.1. Cách 1: giống với list
Để truy cập vào phần tử ở hàng thứ i, cột thứ j của ma trận (chỉ số bắt đầu từ 0), ta có thể coi phần tử đó là phần tử thứ j của mảng i trong mảng hai chiều ban đầu.
Ví dụ:
ở đây A chính lả mảng một chiều , trong mảng này, ta lấy phần tử có chỉ số là 2, phần tử đó có giá trị là 6. Vậy A = 6.2.4.1.2. Cách 2: giống như Matlab
Trong Matlab, để truy cập vào phần tử ở hàng đầu tiên, cột đầu tiên của một ma trận A, ta sử dụng A(1, 1). Trong Numpy, có một chút thay đổi:
Chỉ số bắt đầu từ 0. Bộ chỉ số được đặt trong dấu ngoặc vuông .
Ví dụ
2.4.2. Truy cập vào hàng/cột
Để truy cập vào hàng có chỉ số i của một ma trận A, ta chỉ cần dùng A hoặc A hoặc A<:>:
Để truy cập vào cột có chỉ số j, ta dùng A<:>:Chú ý:
Trong Numpy, kết quả trả về của một cột hay hàng đều là một mảng một chiều, không phải là một vector cột như trong Matlab. Tuy nhiên, khi lấy một ma trận nhân với nó, nó vẫn được coi là một vector cột. Thông tin chi tiết sẽ có trong các bài sau.
Nếu sử dụng A<:>, kết quả trả về là hàng có chỉ số 1 chứ không phải cột có chỉ số 1. Trong trường hợp này, A<:> vẫn được hiểu là cả ma trận A, vì vậy nên A<:> tương đương với A.
Có sự khác nhau căn bản giữa A và A<:>, chúng ta sẽ quay lại trong một bài nào đó ở sau.
Bài tập:
Cho một ma trận A, viết hàm myfunc tính tổng các phần tử trên các cột có chỉ số chẵn (0, 2, 4, …) của ma trận đó. Ví dụ: