Доступ к scipy.sparse.csr_matrix, все строки без нулевого столбца j - PullRequest
4 голосов
/ 31 марта 2012

Я надеюсь, что мой вопрос ясен, но, скажем, у меня есть разреженная матрица, подобная следующей:

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, :]

Так есть ли более элегантный способ сделать это?Заранее спасибо.

1 Ответ

1 голос
/ 13 октября 2012

Это один из способов сделать это:

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.

...