Truy cập các phần tử của ma trận thưa Python

Ma trận thưa thớt là gì? . Chúng ta cũng có thể gọi dữ liệu đó là ma trận, trong ví dụ này là ma trận 10 x 10 dày đặc. Bây giờ hãy tưởng tượng, bạn có một ma trận 10 x 10 chỉ có rất ít phần tử của ma trận là khác không. Trong trường hợp đó, lưu trữ dữ liệu trong cấu trúc dữ liệu hai chiều như vậy là lãng phí không gian. Khi kích thước của dữ liệu đó lớn, nó gần như không thể sử dụng/lưu trữ

Giới thiệu về Ma trận thưa thớt trong Python

Ma trận thưa thớt là cấu trúc dữ liệu hiệu quả về bộ nhớ cho phép chúng ta lưu trữ các ma trận lớn với rất ít phần tử khác 0 hay còn gọi là ma trận thưa thớt. Ngoài khả năng lưu trữ hiệu quả, cấu trúc dữ liệu ma trận thưa còn cho phép chúng ta thực hiện các phép tính ma trận phức tạp. Khả năng thực hiện các tính toán như vậy cực kỳ mạnh mẽ trong nhiều vấn đề khoa học dữ liệu. Học cách làm việc với Ma trận thưa, ma trận lớn hoặc mảng 2d với nhiều phần tử bằng 0, có thể cực kỳ tiện dụng

Thư viện SciPy của Python có rất nhiều tùy chọn để tạo, lưu trữ và vận hành với Ma trận thưa thớt. Có 7 loại ma trận thưa khác nhau có sẵn

  1. bsr_matrix . Khối ma trận hàng thưa
  2. coo_matrix . Ma trận định dạng tọa độ
  3. csc_matrix . Ma trận cột thưa được nén
  4. csr_matrix . C được nén thưa thớt  R ma trận ow
  5. dia_matrix . Ma trận thưa thớt với  DIA bộ nhớ chung
  6. dok_matrix . D từ điển  O K . eys based sparse matrix.
  7. lil_matrix . Ma trận thưa danh sách liên kết dựa trên hàng

Làm thế nào để chọn đúng ma trận thưa thớt?

Mỗi ma trận thưa thớt này đều hiệu quả và nhanh chóng cho các hoạt động cụ thể. Ví dụ: nếu bạn muốn tạo một ma trận thưa thớt mới từ đầu thì lil_matrix hoặc dok_matrix đều hiệu quả. Tuy nhiên, các phép toán số học trên ma trận không hiệu quả. coo_matrix có các thuộc tính tương tự;

Nếu bạn quan tâm đến các phép toán ma trận, như phép nhân hoặc phép nghịch đảo thì định dạng ma trận thưa thớt CSC hoặc CSR sẽ phù hợp/hiệu quả hơn. Do bản chất của cấu trúc dữ liệu, csc_matrix cắt cột nhanh hơn/hiệu quả hơn, trong khi csr_matrix cắt hàng nhanh hơn

Trong bài đăng này, chúng ta sẽ xem một vài ví dụ đơn giản về cách tạo ma trận thưa thớt và sử dụng chúng trong Python. Hãy để chúng tôi bắt đầu với việc tải trước các gói/mô-đun cần thiết. Chúng tôi sẽ sử dụng mô-đun thưa thớt của SciPy cho các ma trận thưa thớt

Chọn đúng ma trận thưa phụ thuộc vào ứng dụng. Thông thường, bạn có thể phải sử dụng nhiều định dạng ma trận thưa thớt để hoàn thành công việc. Mô-đun thưa thớt của SciPy có các chức năng thực sự hay để chuyển đổi một loại ma trận thưa thớt này sang một loại ma trận thưa thớt khác

# import sparse module from SciPy package 
from scipy import sparse
# import uniform module to create random numbers
from scipy.stats import uniform
# import NumPy
import numpy as np

Làm cách nào để tạo ma trận thưa thớt COO?

Một trong những ma trận trực quan hơn là ma trận thưa thớt COOordinary. Người ta có thể tạo ma trận thưa thớt COO nhanh chóng. Về cơ bản, chúng ta cần tọa độ của các phần tử khác không trong ma trận thưa thớt

Để tạo một coo_matrix, chúng ta cần 3 mảng một chiều có nhiều mảng. Mảng đầu tiên đại diện cho các chỉ số hàng, mảng thứ hai đại diện cho các chỉ số cột và mảng thứ ba đại diện cho dữ liệu khác không trong phần tử. Các chỉ số hàng và cột chỉ định vị trí của phần tử khác không và mảng dữ liệu chỉ định dữ liệu khác không thực tế trong đó

Hãy để chúng tôi tạo một ma trận thưa thớt ở định dạng COO bằng ví dụ đơn giản. Trước tiên chúng ta hãy tạo 3 mảng numpy cần thiết để tạo ma trận thưa thớt COO

# row indices
row_ind = np.array[[0, 1, 1, 3, 4]]
# column indices
col_ind = np.array[[0, 2, 4, 3, 4]]
# data to be stored in COO sparse matrix
data = np.array[[1, 2, 3, 4, 5], dtype=float]

Chúng ta có thể sử dụng thưa thớt. coo_matrix để tạo ma trận thưa thớt ở định dạng COO. Nó lấy dữ liệu và bộ chỉ mục hàng và cột làm đối số

# create COO sparse matrix from three arrays
>mat_coo = sparse.coo_matrix[[data, [row_ind, col_ind]]]
# print coo_matrix
>print[mat_coo]
  [0, 0]	1.0
  [1, 2]	2.0
  [1, 4]	3.0
  [3, 3]	4.0
  [4, 4]	5.0

coo_matrix có rất nhiều chức năng hữu ích bao gồm chức năng chuyển đổi coo_matrix sang các ma trận thưa thớt khác và cả ma trận dày đặc. Đây là một hàm toarray để xem mảng 2d của ma trận thưa thớt mà chúng ta vừa tạo

>print[mat_coo.toarray[]]
[[ 1.  0.  0.  0.  0.]
 [ 0.  0.  2.  0.  3.]
 [ 0.  0.  0.  0.  0.]
 [ 0.  0.  0.  4.  0.]
 [ 0.  0.  0.  0.  5.]]

Dưới đây là một ví dụ để chuyển đổi ma trận coo thành ma trận thưa thớt CSC

>print[mat_coo.tocsc[]]
 [0, 0]	1.0
 [1, 2]	2.0
 [3, 3]	4.0
 [1, 4]	3.0
 [4, 4]	5.0

Lưu ý thứ tự dữ liệu được lưu trữ ở định dạng CSC khác với ma trận thưa thớt COO

Làm cách nào để tạo Ma trận thưa thớt từ Ma trận dày đặc [đầy đủ]?

Trong ví dụ trên về tạo ma trận COO, chúng tôi có dữ liệu ở định dạng đẹp và do đó chúng tôi có thể sử dụng nó để tạo ma trận thưa thớt COO. Thông thường, chúng tôi bắt đầu với một ma trận đầy đủ làm đầu vào. Dưới đây là một ví dụ cho thấy cách sử dụng mảng/ma trận 2d hiện có để tạo ma trận thưa thớt

Lần này chúng ta sẽ tạo ma trận thưa thớt csr_matrix. Và chúng tôi cũng sẽ tạo ma trận đầy đủ bằng cách sử dụng các số ngẫu nhiên từ phân phối đồng đều trong SciPy. số liệu thống kê

Trước tiên chúng ta hãy đặt một hạt giống để tạo số ngẫu nhiên, để chúng ta có thể tạo lại các số ngẫu nhiên giống nhau. Chúng tôi sẽ sử dụng SciPy. mô-đun thống kê để tạo ma trận đồ chơi thưa thớt chỉ với 4 hàng và 4 cột

Trước tiên, chúng tôi sẽ tạo các số ngẫu nhiên thống nhất từ ​​0 đến 2 trong mảng 1d NumPy. Và sau đó sử dụng chức năng định hình lại để biến nó thành mảng 2d-numpy i. e. một ma trận

np.random.seed[seed=42]
data = uniform.rvs[size=16, loc = 0, scale=2]
data = np.reshape[data, [4, 4]]
data

Chúng ta có thể thấy rằng chúng ta đã tạo mảng 2d 4 × 4 với các số ngẫu nhiên đồng nhất

array[[[ 0.74908024,  1.90142861,  1.46398788,  1.19731697],
       [ 0.31203728,  0.31198904,  0.11616722,  1.73235229],
       [ 1.20223002,  1.41614516,  0.04116899,  1.9398197 ],
       [ 1.66488528,  0.42467822,  0.36364993,  0.36680902]]]

Hãy để chúng tôi chuyển đổi ma trận đầy đủ này thành một ma trận thưa thớt. Trước tiên chúng ta hãy tạo một số phần tử của ma trận không. Ở đây bất kỳ phần tử nào có giá trị nhỏ hơn 1 sẽ được gán cho 0. Bây giờ một nửa các phần tử của ma trận này bằng không

# make elements with value less < 1 to zero 
data[data < 1] = 0 

Chúng ta có thể thấy rằng các phần tử có giá trị nhỏ hơn 1 bây giờ bằng 0

________số 8_______

Hãy để chúng tôi chuyển đổi ma trận đầy đủ này với các số 0 thành ma trận thưa thớt bằng cách sử dụng mô-đun thưa thớt trong SciPy. Như bạn vừa thấy, SciPy có nhiều tùy chọn cho các ma trận thưa thớt. Chúng tôi sẽ sử dụng csr_matrix, trong đó csr là viết tắt của Hàng thưa được nén

data_csr = sparse.csr_matrix[data]

Chúng tôi cũng có thể in ma trận thưa thớt nhỏ để xem dữ liệu được lưu trữ như thế nào

# row indices
row_ind = np.array[[0, 1, 1, 3, 4]]
# column indices
col_ind = np.array[[0, 2, 4, 3, 4]]
# data to be stored in COO sparse matrix
data = np.array[[1, 2, 3, 4, 5], dtype=float]
0

Chúng ta có thể thấy rằng trong ma trận thưa thớt csr, chúng ta chỉ có các phần tử khác không. Ngoài ra, các phần tử được lưu trữ theo hàng khôn ngoan, để lại bất kỳ phần tử 0 nào. Ví dụ đồ chơi cho thấy cách tạo ma trận thưa thớt từ ma trận đầy đủ trong Python

Chúng ta có được bao nhiêu dung lượng bằng cách lưu trữ một ma trận thưa thớt lớn trong SciPy. thưa thớt?

Một trong những ứng dụng thực sự của ma trận thưa thớt là giảm dung lượng rất lớn để lưu trữ các ma trận thưa thớt. Hãy để chúng tôi tạo một ma trận đầy đủ lớn hơn bằng cách sử dụng các số ngẫu nhiên thống nhất

# row indices
row_ind = np.array[[0, 1, 1, 3, 4]]
# column indices
col_ind = np.array[[0, 2, 4, 3, 4]]
# data to be stored in COO sparse matrix
data = np.array[[1, 2, 3, 4, 5], dtype=float]
1

Hãy để chúng tôi làm cho ma trận trở nên thưa thớt bằng cách đặt một số phần tử bằng không. Như trước đây, chúng tôi tạo bất kỳ phần tử nào có giá trị nhỏ hơn 1 thành 0. Chúng ta có thể sử dụng hàm nbytes trong NumPy để lấy số byte và lấy kích thước của ma trận tính bằng MB

# row indices
row_ind = np.array[[0, 1, 1, 3, 4]]
# column indices
col_ind = np.array[[0, 2, 4, 3, 4]]
# data to be stored in COO sparse matrix
data = np.array[[1, 2, 3, 4, 5], dtype=float]
2

Chúng ta có thể thấy kích thước của ma trận đầy đủ có kích thước 1 Triệu phần tử với một nửa trong số chúng có giá trị bằng 0 là khoảng 80 MB

# row indices
row_ind = np.array[[0, 1, 1, 3, 4]]
# column indices
col_ind = np.array[[0, 2, 4, 3, 4]]
# data to be stored in COO sparse matrix
data = np.array[[1, 2, 3, 4, 5], dtype=float]
3

Với việc sử dụng ma trận thưa thớt, kích thước của dữ liệu trong ma trận thưa thớt chỉ khoảng 5MB, giảm rất nhiều không gian. Điều này chủ yếu là do cấu trúc dữ liệu hiệu quả để chỉ lưu trữ các phần tử khác không

Làm cách nào để sử dụng csr_matrix trong Python?

csr_matrix[[M, N], [dtype]] để tạo một ma trận trống có hình dạng [M, N] dtype là tùy chọn, mặc định là dtype='d'. csr_matrix[[data, [row_ind, col_ind]], [shape=[M, N]]] trong đó data , row_ind và col_ind thỏa mãn mối quan hệ a[row_ind[k], col_ind[k]] = data[k].

Coo_matrix trong Python là gì?

scipy của lớp. thưa thớt. coo_matrix[arg1, shape=None, dtype=None, copy=False][source] Một ma trận thưa ở định dạng COOrdinate . Còn được gọi là định dạng 'ijv' hoặc 'bộ ba'.

Scipy thưa thớt trong Python là gì?

Dữ liệu thưa thớt là dữ liệu có hầu hết các phần tử không được sử dụng [các phần tử không mang bất kỳ thông tin nào ] . Nó có thể là một mảng như thế này. [1, 0, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0] Dữ liệu thưa thớt. là một tập dữ liệu trong đó hầu hết các giá trị mục bằng không. Mảng dày đặc. ngược lại với một mảng thưa thớt. hầu hết các giá trị khác không.

Định dạng CSR là gì?

Hàng thưa được nén [CSR] hoặc lưu trữ hàng được nén [CRS] hoặc định dạng Yale biểu thị một ma trận M bằng ba mảng [một chiều], tương ứng chứa các giá trị khác không, . Nó tương tự như COO, nhưng nén các chỉ số hàng, do đó có tên. . It is similar to COO, but compresses the row indices, hence the name.

Chủ Đề