Hướng dẫn sparse in python - thưa thớt trong trăn

Tùy thuộc vào việc lập chỉ mục, có thể dễ dàng hơn để xây dựng ma trận trích xuất/lập chỉ mục với kiểu đầu vào

In [133]: extractor = sparse.csr_matrix(([1,1],([0,3],[0,3])))
In [134]: extractor
Out[134]: 
<4x4 sparse matrix of type ''
    with 2 stored elements in Compressed Sparse Row format>
3:

In [129]: from scipy import sparse
In [130]: M = sparse.csr_matrix(np.arange(16).reshape(4,4))
In [131]: M
Out[131]: 
<4x4 sparse matrix of type ''
    with 15 stored elements in Compressed Sparse Row format>
In [132]: M.A
Out[132]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

Một ma trận trích xuất hình vuông với các giá trị "đường chéo" mong muốn:

In [133]: extractor = sparse.csr_matrix(([1,1],([0,3],[0,3])))
In [134]: extractor
Out[134]: 
<4x4 sparse matrix of type ''
    with 2 stored elements in Compressed Sparse Row format>

Phép nhân ma trận theo một hướng chọn các cột:

In [135]: [email protected]
Out[135]: 
<4x4 sparse matrix of type ''
    with 7 stored elements in Compressed Sparse Row format>
In [136]: _.A
Out[136]: 
array([[ 0,  0,  0,  3],
       [ 4,  0,  0,  7],
       [ 8,  0,  0, 11],
       [12,  0,  0, 15]])

Và trong các hàng khác:

In [137]: [email protected]
Out[137]: 
<4x4 sparse matrix of type ''
    with 7 stored elements in Compressed Sparse Row format>
In [138]: _.A
Out[138]: 
array([[ 0,  1,  2,  3],
       [ 0,  0,  0,  0],
       [ 0,  0,  0,  0],
       [12, 13, 14, 15]])
In [139]: extractor.A
Out[139]: 
array([[1, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 1]])

In [133]: extractor = sparse.csr_matrix(([1,1],([0,3],[0,3])))
In [134]: extractor
Out[134]: 
<4x4 sparse matrix of type ''
    with 2 stored elements in Compressed Sparse Row format>
4 làm điều tương tự, nhưng với:

In [140]: extractor = sparse.csr_matrix(([1,1],([0,1],[0,3])))
In [142]: ([email protected]).A
Out[142]: 
array([[ 0,  1,  2,  3],
       [12, 13, 14, 15]])

Các tổng hàng và cột cũng được thực hiện với phép nhân ma trận:

In [149]: (4,int)
Out[149]: array([ 6, 22, 38, 54])

Đôi khi, trong khi làm việc với các ma trận thưa thớt lớn trong Python, bạn có thể muốn chọn một số hàng ma trận thưa thớt nhất định hoặc một số cột nhất định của ma trận thưa thớt. Như chúng ta đã thấy trước đó, có nhiều loại ma trận thưa thớt có sẵn trong Scipy trong Python. Mỗi loại ma trận thưa thớt được tối ưu hóa cho các hoạt động cụ thể.

Chúng ta sẽ thấy các ví dụ về việc cắt một ma trận thưa thớt theo hàng và cột. Về cơ bản, chúng tôi sẽ tạo một ma trận thưa thớt ngẫu nhiên và chọn một tập hợp con hoặc cột từ ma trận thưa thớt bằng cách sử dụng scipy/numpy trong Python.

Hãy để chúng tôi tải các mô -đun cần thiết.

from scipy import sparse
import numpy as np
from scipy import stats

Hãy để chúng tôi tạo một ma trận ngẫu nhiên thưa thớt bằng cách sử dụng chức năng ngẫu nhiên mô -đun thưa thớt của SCIPY. Ở đây chúng tôi tạo ra ma trận ngẫu nhiên thưa thớt có kích thước 5 x 5 chứa các số ngẫu nhiên từ phân phối Poisson.

A = sparse.random(5, 5,
                  density=0.5,
                  data_rvs=stats.poisson(10, loc=10).rvs)

Chúng ta có thể thấy nội dung của ma trận thưa thớt với câu lệnh in và hàm Todense ().

print(A.todense())

[[ 0. 18. 23. 19.  0.]
 [ 0. 20. 23.  0. 14.]
 [ 0.  0.  0. 17. 17.]
 [17.  0. 25.  0. 20.]
 [ 0. 22.  0.  0.  0.]]

Hãy để chúng tôi nói rằng chúng tôi quan tâm đến các hàng hoặc cột với các chỉ số thậm chí.

select_ind = np.array([0,2,4])

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

Chúng tôi có thể tập hợp con ma trận thưa thớt ban đầu của chúng tôi bằng cách sử dụng hoạt động lát cắt. Điều cần lưu ý là chức năng Sparse.random tạo ra ma trận thưa thớt ở định dạng COO theo mặc định. Tuy nhiên, Matrix COO không thân thiện với các hoạt động.

Vì vậy, trước tiên chúng tôi chuyển đổi ma trận thưa thớt COO thành Ma trận CSR (định dạng hàng thưa thớt) bằng cách sử dụng hàm tocsr (). Và sau đó chúng ta có thể cắt các hàng ma trận thưa thớt bằng mảng chỉ số hàng mà chúng ta đã tạo.

In [133]: extractor = sparse.csr_matrix(([1,1],([0,3],[0,3])))
In [134]: extractor
Out[134]: 
<4x4 sparse matrix of type ''
    with 2 stored elements in Compressed Sparse Row format>
0

Chúng ta có thể thấy rằng sau khi cắt, chúng ta có được một ma trận thưa thớt có kích thước 3 × 5 ở định dạng CSR. Để xem nội dung của ma trận thưa thớt được cắt lát, chúng ta có thể sử dụng hàm Todense (). Bây giờ chúng tôi chỉ có ba hàng thay vì năm.

In [133]: extractor = sparse.csr_matrix(([1,1],([0,3],[0,3])))
In [134]: extractor
Out[134]: 
<4x4 sparse matrix of type ''
    with 2 stored elements in Compressed Sparse Row format>
1

Làm thế nào để chọn các cột từ một ma trận thưa thớt?

Chúng ta có thể làm tương tự cho các cột cắt của một ma trận thưa thớt. Trước tiên chúng tôi sẽ phải chuyển đổi sang ma trận CSR hoặc CSC và sau đó sử dụng thao tác lát cắt để chọn các cột mà chúng tôi quan tâm.

Hãy cho chúng tôi sử dụng tocsr () như trước và chọn các cột có chỉ số.

In [133]: extractor = sparse.csr_matrix(([1,1],([0,3],[0,3])))
In [134]: extractor
Out[134]: 
<4x4 sparse matrix of type ''
    with 2 stored elements in Compressed Sparse Row format>
2

Một tùy chọn khác để cắt các hàng hoặc cột của ma trận thưa thớt không lớn là chuyển đổi thành ma trận và các hàng lát/cột. Rõ ràng phương pháp này không hiệu quả hoặc có thể khi kích thước ma trận thưa thớt lớn.