2012-01-17 69 views
9

Khi sử dụng pytables, không có hỗ trợ (theo như tôi có thể biết) cho các định dạng ma trận scipy.sparse, do đó, để lưu trữ ma trận, tôi phải thực hiện một số chuyển đổi, ví dụ:Sử dụng pytables, hiệu quả hơn: ma trận scipy.sparse hoặc dày đặc dày đặc?

def store_sparse_matrix(self): 
    grp1 = self.getFileHandle().createGroup(self.getGroup(), 'M') 
    self.getFileHandle().createArray(grp1, 'data', M.tocsr().data) 
    self.getFileHandle().createArray(grp1, 'indptr', M.tocsr().indptr) 
    self.getFileHandle().createArray(grp1, 'indices', M.tocsr().indices) 

def get_sparse_matrix(self): 
    return sparse.csr_matrix((self.getGroup().M.data, self.getGroup().M.indices, self.getGroup().M.indptr)) 

Vấn đề là các get_sparse chức năng phải mất một thời gian (đọc từ đĩa), và nếu tôi hiểu nó một cách chính xác cũng đòi hỏi dữ liệu để phù hợp với bộ nhớ.

Tùy chọn duy nhất khác dường như chuyển đổi ma trận thành định dạng dày đặc (numpy array) và sau đó sử dụng pytables bình thường. Tuy nhiên điều này có vẻ là không hiệu quả, mặc dù tôi cho rằng có lẽ pytables sẽ đối phó với bản thân nén?

+0

Sử dụng một mảng NumPy thông thường chắc chắn sẽ yêu cầu toàn bộ ma trận, bao gồm cả số không, để vừa với bộ nhớ. Bạn cũng sẽ không thể khai thác sự thưa thớt trong thuật toán của mình. Nhưng chính xác thì câu hỏi của bạn là gì? –

+1

@larsmans nhưng khi sử dụng một mảng NumPy kết hợp với pytables, sự hiểu biết của tôi là nó chỉ tải từ đĩa khi cần thiết, và do đó toàn bộ ma trận không phải phù hợp với bộ nhớ. Tuy nhiên nó yêu cầu toàn bộ ma trận, kể cả số không, được lưu trữ trên đĩa (và do đó đọc/ghi vào đĩa khi cần thiết). Dường như điều này sẽ tạo ra chi phí không cần thiết, khi trong thực tế chỉ có một vài giá trị có thể cần phải được đọc. Tuy nhiên mà không có hỗ trợ cho scipy.sparse tôi không thể xem làm thế nào để tránh điều này? – tdc

+2

Vì vậy, câu hỏi là, "điều này sẽ yêu cầu tải ma trận CSR?" Tôi không thể trả lời vì tôi không biết PyTables. Tôi biết rằng bạn có thể xây dựng một ma trận CSR được hỗ trợ bởi mảng mmap'd ... –

Trả lời

2

Vay từ Storing numpy sparse matrix in HDF5 (PyTables), bạn có thể sắp xếp một mảng scipy.sparse sang một định dạng pytables sử dụng của nó data, indicies, và indptr thuộc tính, đó là ba thường xuyên numpy.ndarray đối tượng.

+1

Vấn đề với cách tiếp cận này là bạn phải deserialize toàn bộ điều để sử dụng các hoạt động ma trận scipy trên nó, hoặc viết tương đương của riêng bạn mà làm việc trên các mục dữ liệu trong pytables. – tdc

+1

Cũng thấy [câu trả lời của tôi] (http://stackoverflow.com/a/22589030/2858145) về câu hỏi bạn liên kết ... bạn phải lưu trữ thuộc tính 'hình dạng' quá. –

Các vấn đề liên quan