2017-07-23 112 views
1

a,b是1D numpyndarray與整數數據類型相同的大小。Numpy(稀疏)重複索引增量

C是一個2D scipy.sparse.lil_matrix

如果索引[a, b]包含重複指示,並C[a, b] += np.array([1])總是遞增C正好一次通過[a, b]C每個唯一索引?

文件提到了這個嗎?

例子:

import scipy.sparse as ss 
import numpy as np 
C = ss.lil_matrix((3,2), dtype=int) 
a = np.array([0, 1, 2] * 4) 
b = np.array([0, 1] * 6) 
C[a, b] += np.array([1]) 
print(C.todense(), '\n') 
C[a, b] += np.array([1]) 
print(C.todense()) 

結果:

[[1 1] 
[1 1] 
[1 1]] 

[[2 2] 
[2 2] 
[2 2]] 

回答

1

我不知道它的記錄

這是衆所周知的是密集陣列的每一個獨立指數僅有一次因緩衝。我們必須使用add.at來獲得無緩衝的加法。

In [966]: C=sparse.lil_matrix((3,2),dtype=int) 
In [967]: Ca=C.A 
In [968]: Ca += 1 
In [969]: Ca 
Out[969]: 
array([[1, 1], 
     [1, 1], 
     [1, 1]]) 

In [970]: Ca=C.A 
In [973]: np.add.at(Ca,(a,b),1) 
In [974]: Ca 
Out[974]: 
array([[2, 2], 
     [2, 2], 
     [2, 2]]) 

你舉的例子表明,lil索引設置在緩衝的感測的行爲爲好。但我不得不看代碼才能看到原因。

據記載,coo樣式輸入在兩個副本之間進行求和。

In [975]: M=sparse.coo_matrix((np.ones_like(a),(a,b)), shape=(3,2)) 
In [976]: print(M) 
    (0, 0) 1 
    (1, 1) 1 
    (2, 0) 1 
    (0, 1) 1 
    (1, 0) 1 
    (2, 1) 1 
    (0, 0) 1 
    (1, 1) 1 
    (2, 0) 1 
    (0, 1) 1 
    (1, 0) 1 
    (2, 1) 1 
In [977]: M.A 
Out[977]: 
array([[2, 2], 
     [2, 2], 
     [2, 2]]) 
In [978]: M 
Out[978]: 
<3x2 sparse matrix of type '<class 'numpy.int32'>' 
    with 12 stored elements in COOrdinate format> 
In [979]: M.tocsr() 
Out[979]: 
<3x2 sparse matrix of type '<class 'numpy.int32'>' 
    with 6 stored elements in Compressed Sparse Row format> 
In [980]: M.sum_duplicates() 
In [981]: M 
Out[981]: 
<3x2 sparse matrix of type '<class 'numpy.int32'>' 
    with 6 stored elements in COOrdinate format> 

點存儲在coo格式作爲輸入,但用於顯示或計算(CSR格式)重複相加時。