онемел.где эквивалент для csr matrix python
Я пытаюсь использовать numpy.где с csr_matrix, которая доза не работает. Я спрашиваю, есть ли какая-то встроенная функция, эквивалентная numpy.где для разреженной матрицы. Вот пример того, что я хотел бы сделать без использования Forloop или .тоденс()
import scipy.sparse as spa
import numpy as np
N = 100
A = np.zeros((N,N))
di = np.diag_indices((len(A[:,0])))
A[di] = 2.3
'''
adding some values to non-diagonal terms
for sake of example
'''
for k in range(0,len(A)-1):
for j in range(-1,3,2):
A[k,k+j] = 4.0
A[2,3] =0.1
A[3,3] = 0.1
A[0,4] = 0.2
A[0,2] = 3
'''
creating sparse matrix
'''
A = spa.csc_matrix((N,N))
B = spa.csc_matrix((N,N))
'''
Here I get
TypeError: unsupported operand type(s) for &: 'csc_matrix' and 'csc_matrix'
'''
ind1 = np.where((A>0.0) & (A<=1.0))
B[ind1] = (3.0-B[ind1])**5-6.0*(2.0-B[ind1])**5
1 ответ:
Как насчет работы с базовыми массивами для
AиB, массивамиdataIn [36]: ind2=np.where((A.data>0.0)&(A.data<=1.0)) In [37]: A.indices[ind2] Out[37]: array([2, 3, 0]) In [38]: A.indptr[ind2] Out[38]: array([28, 31, 37]) In [39]: A.data[ind2] Out[39]: array([ 0.1, 0.1, 0.2]) In [41]: B.data[ind2]=(3.0-B.data[ind2])**5-6.0*(2.0-B.data[ind2])**5 In [42]: B.data[ind2] Out[42]: array([ 56.54555, 56.54555, 58.7296 ])Чтобы увидеть, чему соответствует
ind2в плотной версии, преобразуйте массив вcooIn [53]: Ac=A.tocoo() In [54]: (Ac.row[ind2], Ac.col[ind2]) Out[54]: (array([2, 3, 0]), array([3, 3, 4]))Где, для справки,
whereна плотном массиве является:In [57]: np.where((A.A>0.0) & (A.A<=1.0)) Out[57]: (array([0, 2, 3]), array([4, 3, 3]))Одно важное предостережение - работа с
A.dataозначает, что вы исключаете все нулевые записи плотного массива.
Comments