Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách lưu trữ ma trận thưa thớt một cách hiệu quả bằng cách sử dụng từ điển trong Python. Nhiều lần chúng ta gặp phải tình huống lãng phí bộ nhớ để lưu trữ dữ liệu một cách không hiệu quả. Để khắc phục vấn đề này, chúng ta có thể sử dụng các cấu trúc dữ liệu như từ điển trong Python
TỪ ĐIỂN
Từ điển là một cấu trúc dữ liệu trong đó chúng tôi lưu trữ các giá trị dưới dạng một cặp khóa và giá trị
- Mỗi khóa của nó được cách ly với giá trị của nó bằng dấu hai chấm [. ]
- Các mục liên tiếp được phân biệt bằng dấu phẩy [,]
cú pháp
Dictonary_name={key1:value_1,key2:value_2...}
MA TRẬN THẺ
Nó là một ma trận chứa rất ít phần tử khác không. Hầu hết các phần tử của nó bằng không. Khi nó được biểu diễn bằng mảng 2 chiều, chúng ta sẽ tốn rất nhiều dung lượng trong bộ nhớ
Vì hầu hết các phần tử của nó đều bằng 0, nên chúng tôi cố gắng chỉ lưu trữ các phần tử khác 0 vì dù sao thì tất cả các phần tử còn lại cũng sẽ bằng 0. Vì vậy, bây giờ một câu hỏi đặt ra là tại sao lại sử dụng ma trận thưa thớt này?
Câu trả lời là các ma trận này rất hữu ích để lưu trữ dữ liệu chứa một số lượng lớn các phần tử có giá trị bằng 0 và có thể tiết kiệm rất nhiều bộ nhớ cũng như tăng tốc độ xử lý
[1,] [2,] [3,] [4,] [5,]
[,1] 2 0 0 0 0
[,2] 0 0 0 0 1
[,3] 2 0 2 0 0
[,4] 0 0 0 3 0
[,5] 1 4 0 0 0
Để lưu trữ cái này hiệu quả hơn trong bộ nhớ, chúng tôi sử dụng từ điển trong Python. Bằng cách sử dụng từ điển, chúng ta có thể chỉ ra các hàng và cột có chứa phần tử khác 0 cùng với giá trị có trong chúng
matrix=[[0,0,0,1,0], [2,0,0,0,3], [0,0,0,4,0]] Dict={} print["Sparse Matrix"] for i in range [len[matrix]]: print["\n"] for j in range[len[matrix[i]]]: print[matrix[i][j],end=' '] if matrix[i][j]!=0: Dict[[i,j]]=matrix[i][j] print["\n\n Sparse Matrix can be efficiently represented as Dictionary :"] print[Dict]
ĐẦU RA
Sparse Matrix 0 0 0 1 0 2 0 0 0 3 0 0 0 4 0 sparse matrix can be efficiently represented as Dictionary: {[0, 3]: 1, [2, 3]: 4, [1, 0]: 2, [1, 4]: 3}
Trong ví dụ trên, ma trận chỉ chứa 4 phần tử khác không và do đó chúng được hiển thị dưới dạng từ điển
Nhiều phương pháp tồn tại để lưu trữ các ma trận thưa thớt ở các định dạng nén tiêu thụ ít bộ nhớ hơn đáng kể so với các ma trận dày đặc điển hình1
Các ma trận thưa được nén trong Python được xử lý phổ biến nhất với mô-đun thưa từ scipy. Theo đó, bộ bài toán này kiểm tra kiến thức của bạn về ma trận thưa thớt của scipy
Bạn có biết NumPy không?scipy được xây dựng trên NumPy. Chúng tôi thực sự khuyên bạn nên tìm hiểu một số NumPy trước khi học các ma trận thưa thớt scipy
Cách cài đặt scipy¶
pip insall scipy
Cách nhập mô-đun thưa thớt của scipy¶
from scipy import sparse
Định dạng nén ma trận thưa thớt¶
Ma trận thưa thớt có thể được lưu trữ ở nhiều định dạng nén khác nhau, mỗi định dạng có ưu và nhược điểm riêng
FormatDetailsProsConsDictionary Of Keys [DOK]sử dụng từ điển để ánh xạ [hàng, cột]-các cặp với giá trị của các phần tử- truy cập nhanh vào các phần tử riêng lẻ- tốt cho việc xây dựng ma trận gia tăng- .
- slow access rows, colsList of Lists [LIL]stores one list per row, with each entry containing the column index and the value- good for incremental matrix construction- slow access to elements
- slow access to rows, colsCompressed Sparse Row [CSR]Stores three arrays:
- các mục nhập khác 0
- chỉ số cột của các mục nhập khác 0
- tổng số mục nhập khác 0, mỗi .
- các mục nhập khác 0
- chỉ số hàng của các mục nhập khác 0
- số lượng tích lũy của các mục nhập khác 0, mỗi
Hàng thưa được nén [CSR]¶
Giả sử bạn có một ma trận thưa thớt như thế này
uncompressed = np.array[
[[0, 0, 3, 0, 0],
[0, 0, 0, 0, 1],
[1, 0, 0, 2, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1]]
]
Để lưu trữ ma trận này ở định dạng CSR cần có ba mảng
- ______43. một mảng chứa giá trị của từng phần tử khác không
Trong ví dụ này.
4from scipy import sparse
- ______45. một mảng chứa chỉ mục cột của từng phần tử khác không
Trong ví dụ này.
6from scipy import sparse
- ____47. một mảng chứa tổng số phần tử khác 0 tích lũy trên mỗi hàng của ma trận, được thêm vào trước bởi 0
Trong ví dụ này.
8from scipy import sparse
Bạn có thể xác nhận điều này trong scipy bằng cách chuyển đổi
from scipy import sparse
9 thành uncompressed = np.array[
[[0, 0, 3, 0, 0],
[0, 0, 0, 0, 1],
[1, 0, 0, 2, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1]]
]
0 và kiểm tra các thuộc tính from scipy import sparse
3, from scipy import sparse
5 và from scipy import sparse
7 của nómatrix=[[0,0,0,1,0], [2,0,0,0,3], [0,0,0,4,0]] Dict={} print["Sparse Matrix"] for i in range [len[matrix]]: print["\n"] for j in range[len[matrix[i]]]: print[matrix[i][j],end=' '] if matrix[i][j]!=0: Dict[[i,j]]=matrix[i][j] print["\n\n Sparse Matrix can be efficiently represented as Dictionary :"] print[Dict]7
Tại sao điều này lại hữu ích?
Việc xây dựng lại và vận hành trên các hàng của ma trận này cực kỳ hiệu quả vì
from scipy import sparse
7 cung cấp một cách trực tiếp để truy cập các phần tử khác 0 của bất kỳ hàng nào. Ví dụ: xem xét yêu cầu sau. Tìm nạp các phần tử khác 0 ở hàng thứ ba của ma trận [chỉ số hàng 2]
Để hoàn thành việc này,
Tra cứu số phần tử khác 0 xuất hiện trước chỉ mục hàng 2
matrix=[[0,0,0,1,0], [2,0,0,0,3], [0,0,0,4,0]] Dict={} print["Sparse Matrix"] for i in range [len[matrix]]: print["\n"] for j in range[len[matrix[i]]]: print[matrix[i][j],end=' '] if matrix[i][j]!=0: Dict[[i,j]]=matrix[i][j] print["\n\n Sparse Matrix can be efficiently represented as Dictionary :"] print[Dict]
9Sparse Matrix 0 0 0 1 0 2 0 0 0 3 0 0 0 4 0 sparse matrix can be efficiently represented as Dictionary: {[0, 3]: 1, [2, 3]: 4, [1, 0]: 2, [1, 4]: 3}
0
Tra cứu số phần tử khác 0 xuất hiện trên hoặc trước chỉ mục hàng 2
Sparse Matrix 0 0 0 1 0 2 0 0 0 3 0 0 0 4 0 sparse matrix can be efficiently represented as Dictionary: {[0, 3]: 1, [2, 3]: 4, [1, 0]: 2, [1, 4]: 3}
1Sparse Matrix 0 0 0 1 0 2 0 0 0 3 0 0 0 4 0 sparse matrix can be efficiently represented as Dictionary: {[0, 3]: 1, [2, 3]: 4, [1, 0]: 2, [1, 4]: 3}
2
Sử dụng các giá trị đó làm chỉ số lát cắt để tìm nạp các phần tử
3 tương ứngfrom scipy import sparse
Sparse Matrix 0 0 0 1 0 2 0 0 0 3 0 0 0 4 0 sparse matrix can be efficiently represented as Dictionary: {[0, 3]: 1, [2, 3]: 4, [1, 0]: 2, [1, 4]: 3}
4Việc tìm nạp các chỉ số cột tương ứng của chúng thật dễ dàng
0pip insall scipy
Cột thưa được nén [CSC]¶
Định dạng Cột thưa được nén chỉ là sự phản ánh của định dạng Hàng thưa được nén. Ví dụ: giả sử bạn có ma trận thưa thớt sau
uncompressed = np.array[
[[0, 0, 3, 0, 0],
[0, 0, 0, 0, 1],
[1, 0, 0, 2, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1]]
]
Để lưu trữ ma trận này ở định dạng CSC cần có ba mảng
- ______43. một mảng chứa giá trị của từng phần tử khác không
Trong ví dụ này.
7uncompressed = np.array[ [[0, 0, 3, 0, 0], [0, 0, 0, 0, 1], [1, 0, 0, 2, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 1]] ]
- ______45. một mảng chứa chỉ mục hàng của từng phần tử khác không
Trong ví dụ này.
9uncompressed = np.array[ [[0, 0, 3, 0, 0], [0, 0, 0, 0, 1], [1, 0, 0, 2, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 1]] ]
- ____47. một mảng chứa tổng số phần tử khác 0 tích lũy trên mỗi cột của ma trận, được thêm vào trước bởi 0
Trong ví dụ này.matrix=[[0,0,0,1,0], [2,0,0,0,3], [0,0,0,4,0]] Dict={} print["Sparse Matrix"] for i in range [len[matrix]]: print["\n"] for j in range[len[matrix[i]]]: print[matrix[i][j],end=' '] if matrix[i][j]!=0: Dict[[i,j]]=matrix[i][j] print["\n\n Sparse Matrix can be efficiently represented as Dictionary :"] print[Dict]
71
Bạn có thể xác nhận điều này trong scipy bằng cách chuyển đổi
from scipy import sparse
9 thành matrix=[[0,0,0,1,0], [2,0,0,0,3], [0,0,0,4,0]] Dict={} print["Sparse Matrix"] for i in range [len[matrix]]: print["\n"] for j in range[len[matrix[i]]]: print[matrix[i][j],end=' '] if matrix[i][j]!=0: Dict[[i,j]]=matrix[i][j] print["\n\n Sparse Matrix can be efficiently represented as Dictionary :"] print[Dict]73 và kiểm tra các thuộc tính
from scipy import sparse
3, from scipy import sparse
5 và from scipy import sparse
7 của nópip insall scipy
2Tại sao điều này lại hữu ích?
Việc xây dựng lại và vận hành trên các cột của ma trận này cực kỳ hiệu quả vì
from scipy import sparse
7 cung cấp một cách trực tiếp để truy cập các phần tử khác 0 của bất kỳ cột nào. Ví dụ: xem xét yêu cầu sau. Lấy các phần tử khác 0 trong cột thứ năm của ma trận [cột chỉ số 4]
Để hoàn thành việc này,
Tra cứu số phần tử khác 0 xuất hiện trước chỉ số cột 4
3pip insall scipy
Tra cứu số phần tử khác 0 xuất hiện trên hoặc trước chỉ số cột 4
4pip insall scipy
Sử dụng các giá trị đó để tìm nạp các phần tử
3 tương ứngfrom scipy import sparse
5pip insall scipy
Việc tìm nạp các chỉ số hàng tương ứng của chúng thật dễ dàng
6pip insall scipy
Sử dụng cơ bản¶
Khởi tạo¶
Có nhiều cách để khởi tạo một ma trận thưa được nén trong scipy. Có lẽ kỹ thuật phổ biến nhất là sử dụng bộ ba [hàng, col, val]. Ví dụ,
pip insall scipy
7Việc chuyển đổi một mảng NumPy thành ma trận thưa thớt được nén cũng rất phổ biến
pip insall scipy
8thận trọngĐiều này thường được coi là thực hành xấu. Nếu mục tiêu của bạn là xây dựng một ma trận thưa được nén để tiết kiệm bộ nhớ, thì việc xây dựng một mảng gọn gàng ở bất kỳ giai đoạn nào trong quy trình sẽ đánh bại mục đích này. Tìm kiếm một phương pháp khởi tạo tốt hơn
Truy cập dữ liệu¶
Đưa ra một ma trận thưa được nén,
matrix=[[0,0,0,1,0], [2,0,0,0,3], [0,0,0,4,0]] Dict={} print["Sparse Matrix"] for i in range [len[matrix]]: print["\n"] for j in range[len[matrix[i]]]: print[matrix[i][j],end=' '] if matrix[i][j]!=0: Dict[[i,j]]=matrix[i][j] print["\n\n Sparse Matrix can be efficiently represented as Dictionary :"] print[Dict]79,
pip insall scipy
9Bạn có thể truy cập các hàng và cột giống như một mảng NumPy
from scipy import sparse
0Làm cách nào để in ma trận?¶
matrix=[[0,0,0,1,0], [2,0,0,0,3], [0,0,0,4,0]] Dict={} print["Sparse Matrix"] for i in range [len[matrix]]: print["\n"] for j in range[len[matrix[i]]]: print[matrix[i][j],end=' '] if matrix[i][j]!=0: Dict[[i,j]]=matrix[i][j] print["\n\n Sparse Matrix can be efficiently represented as Dictionary :"] print[Dict]90 in các mục khác không của ma trận
from scipy import sparse
1Nếu bạn thực sự muốn in ma trận, hãy chuyển đổi nó thành một mảng NumPy
from scipy import sparse
2coi chừng
Điều này có thể làm nổ máy tính của bạn nếu ma trận thưa thớt rất lớn
Tiếp theo
Ma trận dày đặc là ma trận trong đó hầu hết các phần tử đều khác không. Tuy nhiên, scipy [và những người khác] sử dụng thuật ngữ "dày đặc" để chỉ ma trận không ở định dạng nén. ↩