2013-04-02 30 views
21

Scipy có many different types of sparse matrices available. Sự khác biệt quan trọng nhất giữa các loại này là gì và sự khác biệt trong mục đích sử dụng của chúng là gì?Ma trận thưa thớt scipy - mục đích và cách sử dụng các triển khai khác nhau

Tôi đang phát triển mã trong python dựa trên mã mẫu trong Matlab. Một phần của mã sử dụng ma trận thưa thớt - dường như có một loại (gây phiền nhiễu) duy nhất trong Matlab, và tôi đang cố gắng tìm ra loại nào tôi nên sử dụng trong python.


1: Đây là lớp học. Hầu hết mọi người đang làm dự án ở Matlab, nhưng tôi thích tạo ra công việc không cần thiết và nhầm lẫn --- rõ ràng.

2: Đây là câu hỏi học thuật: Tôi có mã hoạt động đúng với định dạng 'CSR', nhưng tôi rất thú vị khi biết được cách sử dụng tối ưu là gì.

+4

Tôi tin rằng đối với hầu hết các hoạt động đại số tuyến tính, CSR hoặc CSC sẽ là tùy chọn ưa thích của bạn, vì hầu hết các chức năng đều được xây dựng cho các loại này. BSR là một phiên bản khối của CSR. COO và DOK thuận tiện cho việc nhập dữ liệu, nhưng một khi bạn đã nhập tất cả, bạn sẽ muốn chuyển đổi nó sang một trong các loại khác. Và LIL có hỗ trợ tốt hơn cho những thứ như cắt. Không chắc chắn DIA phù hợp cho hoạt động đại số tuyến tính. – Jaime

+1

Bạn nên chấp nhận câu trả lời cho câu hỏi này để đánh dấu câu hỏi là đã giải quyết :) – Will

Trả lời

24

Xin lỗi nếu tôi không trả lời câu trả lời này hoàn toàn đủ, nhưng hy vọng tôi có thể cung cấp một số thông tin chi tiết.

CSC (Cột thưa nén) và CSR (Hàng thưa thớt nén) nhỏ gọn và hiệu quả hơn, nhưng khó xây dựng "từ đầu". Coo (Coordinate) và DOK (Dictionary of Keys) dễ xây dựng hơn, và sau đó có thể được chuyển đổi sang CSC hoặc CSR thông qua matrix.tocsc() hoặc matrix.tocsr().

CSC hiệu quả hơn khi truy cập cột-vectơ hoặc hoạt động cột, thường, vì nó được lưu trữ dưới dạng mảng của cột và giá trị của chúng tại mỗi hàng.

ma trận CSR là đối diện; được lưu trữ dưới dạng mảng các hàng và giá trị của chúng tại mỗi cột và hiệu quả hơn khi truy cập hàng vectơ hoặc hoạt động hàng.