2017-12-31 84 views
0

두 벡터 tdelta - 길이가 모두 n입니다. 그 벡터와 함께 희미한 DIA 행렬 A을 만들고 난 다음 열을 조정하고 싶습니다. 모두 i의 경우 Aith 항목을 왼쪽으로 delta[i] 열로 이동하고 싶습니다.희소 DIA 행렬을 만든 다음 열을 변경하십시오.

열을 쉽게 제어하는 ​​방법은 COO 형식입니다. 여기에 내가 일 것이라고 생각 무엇 : tdelta의 길이가 239 동안

from scipy.sparse import diags 
A = diags([t], offsets=[-1]).tocoo() 
A.col = A.col - delta 

하지만, 내 예제에서 A.nnz == len(A.col)는 만 216이다. 나는 그 일이 어떻게되었는지 이해하지 못한다. nnz"Number of stored values, including explicit zeros."이다.

이 문제를 어떻게 해결할 수 있습니까? 0 밖으로

from numpy import np 
t = np.array([ 2.655, 2.655, 2.655, 2.655, 2.655, 2.655, 2.655, 2.655, 
     2.655, 2.655, 2.655, 2.655, 2.655, 2.655, 2.655, 2.655, 
     2.655, 2.655, 2.655, 2.655, 2.655, 2.655, 2.655, 2.155, 
     2.155, 2.155, 2.155, 2.155, 2.155, 2.155, 2.155, 2.155, 
     2.155, 2.155, 2.155, 2.155, 2.155, 2.155, 2.155, 2.155, 
     2.155, 2.155, 2.155, 2.155, 2.155, 2.155, 2.155, 1.655, 
     1.655, 1.655, 1.655, 1.655, 1.655, 1.655, 1.655, 1.655, 
     1.655, 1.655, 1.655, 1.655, 1.655, 1.655, 1.655, 1.655, 
     1.655, 1.655, 1.655, 1.655, 1.655, 1.655, 1.655, 1.155, 
     1.155, 1.155, 1.155, 1.155, 1.155, 1.155, 1.155, 1.155, 
     1.155, 1.155, 1.155, 1.155, 1.155, 1.155, 1.155, 1.155, 
     1.155, 1.155, 1.155, 1.155, 1.155, 1.155, 1.155, 0.655, 
     0.655, 0.655, 0.655, 0.655, 0.655, 0.655, 0.655, 0.655, 
     0.655, 0.655, 0.655, 0.655, 0.655, 0.655, 0.655, 0.655, 
     0.655, 0.655, 0.655, 0.655, 0.655, 0.655, 0.655, 0.405, 
     0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 
     0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 
     0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 
     0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 
     0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 
     0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 
     0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 
     0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 
     0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 
     0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 
     0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 
     0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 0.405, 0. , 
     0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 
     0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 
     0. , 0. , 0. , 0. , 0. , 0. , 0. ]) 
delta = np.array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 
    5, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 
    5, 5, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 
    5, 5, 5, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 
    5, 5, 5, 5, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 
    4, 5, 5, 5, 5, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 
    4, 4, 5, 5, 5, 5, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 
    4, 4, 4, 5, 5, 5, 5, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 
    4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 
    3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0, 0, 1, 1, 1, 1, 2, 0, 2, 2, 3, 2, 
    1, 3, 4, 3, 0, 3, 5, 4, 1, 0]) 

답변

1
In [29]: t = np.array([1.2, 3.2, 4, 0, 0]) 
In [30]: A = sparse.diags([t], offsets=[-1]) 
In [31]: A 
Out[31]: 
<6x6 sparse matrix of type '<class 'numpy.float64'>' 
    with 5 stored elements (1 diagonals) in DIAgonal format> 

변환 coo에 스트립 : 여기 내 예제 데이터입니다.

In [32]: Ac = A.tocoo() 
In [33]: Ac 
Out[33]: 
<6x6 sparse matrix of type '<class 'numpy.float64'>' 
    with 3 stored elements in COOrdinate format> 

A.tocoo에 대한 코드합니다 (diacoo 버전)에서 찾습니다. 마스크는 (self.data != 0)입니다. 걸 경우


coo 행렬 직접 적어도 일시적으로 0을 유지한다 :

In [58]: A.A 
Out[58]: 
array([[ 0. , 0. , 0. , 0. , 0. , 0. ], 
     [ 1.2, 0. , 0. , 0. , 0. , 0. ], 
     [ 0. , 3.2, 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 4. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. , 0. , 0. ]]) 
In [59]: M = sparse.coo_matrix((t, (np.arange(1,6),np.arange(5))),shape=(6,6)) 
In [60]: M 
Out[60]: 
<6x6 sparse matrix of type '<class 'numpy.float64'>' 
    with 5 stored elements in COOrdinate format> 
In [61]: M.A 
Out[61]: 
array([[ 0. , 0. , 0. , 0. , 0. , 0. ], 
     [ 1.2, 0. , 0. , 0. , 0. , 0. ], 
     [ 0. , 3.2, 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 4. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. , 0. , 0. ]]) 

인플레 이스 제로 제거 :

In [64]: M.eliminate_zeros() 
In [65]: M 
Out[65]: 
<6x6 sparse matrix of type '<class 'numpy.float64'>' 
    with 3 stored elements in COOrdinate format>