2013-02-27 107 views
21
type(A) 
<class 'scipy.sparse.csc.csc_matrix'> 
A.shape 
(8529, 60877) 
print A[0,:] 
    (0, 25) 1.0 
    (0, 7422) 1.0 
    (0, 26062) 1.0 
    (0, 31804) 1.0 
    (0, 41602) 1.0 
    (0, 43791) 1.0 
print A[1,:] 
    (0, 7044) 1.0 
    (0, 31418) 1.0 
    (0, 42341) 1.0 
    (0, 47125) 1.0 
    (0, 54376) 1.0 
print A[:,0] 
    #nothing returned 

現在我不明白的是,當我鍵入A [1 ,:]應該從第二行選擇元素,但我從打印的第一行獲取元素。當我鍵入A [:,0]應該返回第一列,但我什麼也沒有打印。爲什麼?如何訪問稀疏矩陣元素?

回答

18

A[1,:]本身是一個具有形狀(1,60877)的稀疏矩陣。 是要打印的東西,它只有一行,所以所有的行座標爲0

例如:

In [12]: a = csc_matrix([[1,0,0,0],[0,0,10,11],[0,0,0,99]]) 

In [13]: a.todense() 
Out[13]: 
matrix([[ 1, 0, 0, 0], 
     [ 0, 0, 10, 11], 
     [ 0, 0, 0, 99]]) 

In [14]: print a[1,:] 
    (0, 2) 10 
    (0, 3) 11 

In [15]: print a 
    (0, 0) 1 
    (1, 2) 10 
    (1, 3) 11 
    (2, 3) 99 

In [16]: print a[1,:].toarray() 
[[ 0 0 10 11]] 

您可以選擇列,但如果沒有非零元素在列中,沒有顯示當它與print語句輸出:

In [18]: a[:,3].toarray() 
Out[18]: 
array([[ 0], 
     [11], 
     [99]]) 

In [19]: print a[:,3] 
    (1, 0) 11 
    (2, 0) 99 

In [20]: a[:,1].toarray() 
Out[20]: 
array([[0], 
     [0], 
     [0]]) 

In [21]: print a[:,1] 

最後打印語句顯示沒有輸出,因爲列A [:,1]不具有非零元素。

+2

打印'a [0,:]。toarray()'可能會提供更多信息。 – 2013-02-27 15:52:02

+0

@larsmans:+1,我添加了'print a [1,:]。toarray()'。 – 2013-02-27 15:54:16

+0

是不是可以選擇列? – siamii 2013-02-27 16:32:54

7

要使用不同的技術比你的問題的詳細回答您的標題的問題:

csc_matrix給你的方法.nonzero()

考慮:

>>> import numpy as np 
>>> from scipy.sparse.csc import csc_matrix 
>>> 
>>> row = np.array([0, 1, 3]) 
>>> col = np.array([0, 2, 3]) 
>>> data = np.array([1, 4, 16]) 
>>> A = csc_matrix((data, (row, col)), shape=(4, 4)) 

您可以通過訪問該指數poniting非零數據:

>>> rows, cols = A.nonzero() 
>>> rows 
array([0, 1, 3], dtype=int32) 
>>> cols 
array([0, 2, 3], dtype=int32) 

然後你就可以用它來訪問您的數據,而沒有需要作出密集稀疏矩陣的版本:

>>> [((i, j), A[i,j]) for i, j in zip(*A.nonzero())] 
[((0, 0), 1), ((1, 2), 4), ((3, 3), 16)]