我希望我的问题很明确,但是我要说我有一个稀疏矩阵,如下所示:
import numpy as np
a = np.eye(5, 5)
a[0,3]=1
a[3,0]=1
a[4,2]=1
a[3,2]=1
a = csr_matrix(a)
[[ 1. 0. 0. 1. 0.]
[ 0. 1. 0. 0. 0.]
[ 0. 0. 1. 0. 0.]
[ 1. 0. 1. 1. 0.]
[ 0. 0. 1. 0. 1.]]
我想得到的是,例如,列2的值为“1”的所有行都是稀疏矩阵,如:
(0, 2) 1.0
(1, 3) 1.0
(1, 2) 1.0
(1, 0) 1.0
(2, 4) 1.0
(2, 2) 1.0
另外,我想将列2值的所有行作为另一个稀疏矩阵的'0',如:
(0, 3) 1.0
(0, 0) 1.0
(1, 1) 1.0
我不确定我的代码是否有效,但目前我所做的是:
b = np.asarray(a.getcol(2).todense()).reshape(-1)
iPos = np.nonzero(b)[0]
iZero = np.nonzero(np.logical_not(b))[0]
a1 = a[iPos, :]
a0 = a[iZero, :]
那么还有更优雅的方法吗? 提前谢谢。
答案 0 :(得分:1)
这是一种方法:
import numpy as np
from scipy.sparse import csr_matrix
a = np.eye(5, 5)
a[0,3]=1
a[3,0]=1
a[4,2]=1
a[3,2]=1
a = csr_matrix(a)
dense = np.asarray(a.todense())
column = np.asarray(a.getcol(2).todense()).reshape(-1)
print "dense"
# operations on full dense matrix
print "1"
print csr_matrix( np.vstack([ line for line in dense if line[2] == 1 ]) )
print "2"
print csr_matrix( np.vstack([ line for line in dense if line[2] == 0 ]) )
print "sparse"
# Operations on sparse matrix
result1 = []
result2 = []
for irow in range(a.shape[0]):
if column[irow] == 1:
[ result1.append( (irow,indice) ) for indice in a[irow].indices ]
else :
[ result2.append( (irow,indice) ) for indice in a[irow].indices ]
print result1,result2
第一种方法非常紧凑,但使用全密集输入矩阵(如果你处理大矩阵可能会烦恼)而第二种方法只适用于稀疏矩阵,但结果对象是元组列表,不是scipy.sparse.matrix。