2013-01-23 44 views
7

Không có vấn đề:Scipy: Các ma trận thưa thớt có hỗ trợ lập chỉ mục nâng cao không?

>>> t = np.array([[1,1,1,1,1],[2,2,2,2,2],[3,3,3,3,3],[4,4,4,4,4],[5,5,5,5,5]]) 
>>> x = np.arange(5).reshape((-1,1)); y = np.arange(5) 
>>> print (t[[x]],t[[y]]) 

Big vấn đề:

>>> s = scipy.sparse.csr_matrix(t) 
>>> print (s[[x]].toarray(),s[[y]].toarray()) 
Traceback (most recent call last): 
    File "<pyshell#22>", line 1, in <module> 
:    : 
:    : 
ValueError: data, indices, and indptr should be rank 1 

s.toarray()[[x]] công trình lớn, nhưng đánh bại toàn bộ mục đích của tôi sử dụng ma trận thưa thớt như mảng của tôi là quá lớn. Tôi đã kiểm tra các thuộc tính và phương pháp liên kết với một số ma trận thưa thớt cho bất cứ điều gì tham khảo chỉ mục nâng cao, nhưng không có con xúc xắc. Bất kỳ ý tưởng?

+0

Tại sao bạn đặt thêm một cặp dấu ngoặc vuông? Họ là logic run rẩy, điều đó chỉ xảy ra để bỏ qua bởi lý luận của nó. Khác sau đó, hãy thử chỉ số ưa thích 1-d chỉ, đây là những ma trận, lập chỉ mục ưa thích chiều cao hơn sẽ giết ma trận 2-d của bạn anyway khả năng. – seberg

+0

@seberg: Ví dụ trên chỉ minh họa cú pháp [index indexing] (http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html). Trong mã thực sự của tôi, tôi cần lập chỉ mục nâng cao để gọi các hàng _specific_ khi cần (nghĩa là [t [1], t [5], t [6]]) thay vì phạm vi hoặc các lát. –

+0

Có, nhưng việc thêm cặp thừa đó cũng có thể được hiểu là 't [np.array ([x])]' thay vì 't [x,]' thêm một chiều bổ sung vào chỉ mục riêng lẻ. Và tôi sẽ không tin tưởng vào việc lập chỉ mục thưa thớt để xử lý trường hợp này nhất thiết như bạn muốn. – seberg

Trả lời

11

ma trận thưa thớt có hỗ trợ lập chỉ mục rất hạn chế và những gì có sẵn tùy thuộc vào định dạng của ma trận.

Ví dụ:

>>> a = scipy.sparse.rand(100,100,format='coo') 
>>> a[2:5, 6:8] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'coo_matrix' object has no attribute '__getitem__' 

nhưng

>>> a = scipy.sparse.rand(100,100,format='csc') 
>>> a[2:5, 6:8] 
<3x2 sparse matrix of type '<type 'numpy.float64'>' 
    with 0 stored elements in Compressed Sparse Column format> 

mặc dù

>>> a[2:5:2, 6:8:3] 
Traceback (most recent call last): 
... 
ValueError: slicing with step != 1 not supported 

Ngoài ra còn có

>>> a = scipy.sparse.rand(100,100,format='dok') 
>>> a[2:5:2, 6:8:3] 
Traceback (most recent call last): 
... 
NotImplementedError: fancy indexing supported over one axis only 
>>> a[2:5:2,1] 
<3x1 sparse matrix of type '<type 'numpy.float64'>' 
    with 0 stored elements in Dictionary Of Keys format> 

Và thậm chí

>>> a = scipy.sparse.rand(100,100,format='lil') 
>>> a[2:5:2,1] 
<2x1 sparse matrix of type '<type 'numpy.int32'>' 
    with 0 stored elements in LInked List format> 
C:\Python27\lib\site-packages\scipy\sparse\lil.py:230: SparseEfficiencyWarning: Indexing into a lil_matrix with multiple indices is slow. Pre-converting to CSC or CSR beforehand is more efficient. 
    SparseEfficiencyWarning) 
>>> a[2:5:2, 6:8:3] 
<2x1 sparse matrix of type '<type 'numpy.int32'>' 
    with 0 stored elements in LInked List format> 
+0

Vì vậy, những gì bạn đang nói là ... chỉ lập chỉ mục được nêu ở trên sẽ hoạt động, và theo cách của tôi sẽ không? –

+1

@NoobSaibot Có, tôi nghĩ rằng ở trên tóm tắt các khả năng lập chỉ mục cho ma trận thưa thớt. Tôi gần như chắc chắn rằng lập chỉ mục với một mảng 2D sẽ không hoạt động đối với bất kỳ định dạng nào, mặc dù tôi tin rằng LIL sẽ lấy hai mảng 1D cho các chỉ mục và trả về một vectơ hàng. – Jaime

+0

Vâng đó là một cú đấm trong đáy quần ... cảm ơn! –

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