Установите все элементы разреженной матрицы LIL на ноль, сохраняя при этом ее разреженность - PullRequest
0 голосов
/ 30 апреля 2018

В моем коде я выполняю серию итераций. В каждой итерации я использую одну и ту же матрицу A в разреженном lil формате для вычисления чего-либо. Шаблон разрежения A известен априори и не изменяется. В частности, только диагонали с номерами -7:7 содержат ненулевые элементы, все остальные записи всегда равны нулю.

В начале каждой итерации я хочу установить все записи в A на ноль. Возможно ли это сделать без изменения разреженности? (например, количество ненулевых элементов в списке). Это нужно для выступления.

Вот соответствующая часть моего кода. Каждый setdiag(0,i) уменьшает количество ненулевых элементов и, таким образом, изменяет шаблон разреженности.

#loop through iterations
for j in range(0,100):

     #Set all the non-zero entries to zero
     for i in range(-7,8):
            A.setdiag(0,i)

     #perform some computations:
     A.setdiag(23,0)
     ....

1 Ответ

0 голосов
/ 01 мая 2018
In [178]: M = sparse.random(10,10,.2,'lil')
In [179]: M.data
Out[179]: 
array([list([0.10547901096204515, 0.7773041836996356, 0.906367486659326]),
       list([0.5758389931282252]),
       list([0.5346741809135753, 0.42524140314511094, 0.9750432813270062]),
       list([0.3165061782270727, 0.07300201792370353]),
       list([0.14325780997849935, 0.7047922399412353]),
       list([0.4598433233007516]),
       list([0.49436959373252576, 0.4704056215324637, 0.3527714631535005, 0.8823332112975898, 0.3518348016978091]),
       list([]), list([0.9792362001477255]),
       list([0.3205231173252291, 0.0465534963642843])], dtype=object)
In [180]: M.rows
Out[180]: 
array([list([2, 7, 8]), list([6]), list([1, 3, 6]), list([6, 7]),
       list([3, 6]), list([7]), list([2, 4, 5, 7, 9]), list([]),
       list([2]), list([5, 8])], dtype=object)

Легко установить data матрицы csr в ноль и сохранить разреженность (до тех пор, пока не будет запущено eliminate_zeros).

In [182]: Mc.data
Out[182]: 
array([0.10547901, 0.77730418, 0.90636749, 0.57583899, 0.53467418,
       0.4252414 , 0.97504328, 0.31650618, 0.07300202, 0.14325781,
       0.70479224, 0.45984332, 0.49436959, 0.47040562, 0.35277146,
       0.88233321, 0.3518348 , 0.9792362 , 0.32052312, 0.0465535 ])
In [183]: Mc.data[:]=0
In [184]: Mc.A
Out[184]: 
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])
In [185]: Mc
Out[185]: 
<10x10 sparse matrix of type '<class 'numpy.float64'>'
    with 20 stored elements in Compressed Sparse Row format>
In [186]: Mc.eliminate_zeros()
In [187]: Mc
Out[187]: 
<10x10 sparse matrix of type '<class 'numpy.float64'>'
    with 0 stored elements in Compressed Sparse Row format>

Но чтобы сделать то же самое с lil, потребуется выполнить итерацию в массиве data и заменить каждый список соответствующим списком из 0.

In [193]: M = sparse.random(10,10,.2,'lil')
In [194]: M
Out[194]: 
<10x10 sparse matrix of type '<class 'numpy.float64'>'
    with 20 stored elements in LInked List format>
In [195]: for i in range(M.shape[0]):
     ...:     M.data[i] = np.zeros(len(M.data[i])).tolist()
     ...:     
In [196]: M
Out[196]: 
<10x10 sparse matrix of type '<class 'numpy.float64'>'
    with 20 stored elements in LInked List format>
In [197]: M.data
Out[197]: 
array([list([0.0]), list([0.0]), list([0.0]), list([0.0]),
       list([0.0, 0.0, 0.0]), list([0.0, 0.0, 0.0, 0.0]),
       list([0.0, 0.0]), list([0.0, 0.0, 0.0, 0.0, 0.0]), list([0.0]),
       list([0.0])], dtype=object)
...