csr_matrix的numpy.where等效方法

3 投票
1 回答
866 浏览
提问于 2025-04-18 14:53

我正在尝试在稀疏矩阵(csr_matrix)中使用numpy.where,但这并不奏效。我想知道有没有什么内置的函数可以替代numpy.where,用于处理稀疏矩阵。下面是我想做的一个例子,但不想使用循环.todense()方法。

 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 个回答

3

关于如何处理底层数组 AB,也就是 data 数组,怎么样呢?

In [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 在稠密版本中对应的内容,可以把数组转换成 coo 格式。

In [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 时,你会忽略掉稠密数组中的所有零值。

撰写回答