Agregar una columna de ceros a un csr_matrix

Tengo un csr_matrix disperso de csr_matrix , y me gustaría agregar algunas columnas con solo ceros a la derecha de la matriz. En principio, las matrices indptr , los indices y los data siguen igual, así que solo quiero cambiar las dimensiones de la matriz. Sin embargo, esto parece no estar implementado.

 >>> A = csr_matrix(np.identity(5), dtype = int) >>> A.toarray() array([[1, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 1, 0], [0, 0, 0, 0, 1]]) >>> A.shape (5, 5) >>> A.shape = ((5,7)) NotImplementedError: Reshaping not implemented for csr_matrix. 

Además, astackr horizontalmente una matriz cero no parece funcionar.

 >>> B = csr_matrix(np.zeros([5,2]), dtype = int) >>> B.toarray() array([[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]) >>> np.hstack((A,B)) array([ <5x5 sparse matrix of type '' with 5 stored elements in Compressed Sparse Row format>, <5x2 sparse matrix of type '' with 0 stored elements in Compressed Sparse Row format>], dtype=object) 

Esto es lo que quiero lograr con el tiempo. ¿Hay una manera rápida de remodelar mi csr_matrix sin copiar todo lo que csr_matrix ?

 >>> C = csr_matrix(np.hstack((A.toarray(), B.toarray()))) >>> C.toarray() array([[1, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0]]) 

Lo que quieres hacer no es realmente lo que entristecen o entienden como una reforma. Pero para su caso particular, puede crear una nueva matriz de CSR reutilizando los data , indices e indices de su original, sin copiarlos:

 import scipy.sparse as sps a = sps.rand(10000, 10000, density=0.01, format='csr') In [19]: %timeit sps.csr_matrix((a.data, a.indices, a.indptr), ... shape=(10000, 10020), copy=True) 100 loops, best of 3: 6.26 ms per loop In [20]: %timeit sps.csr_matrix((a.data, a.indices, a.indptr), ... shape=(10000, 10020), copy=False) 10000 loops, best of 3: 47.3 us per loop In [21]: %timeit sps.csr_matrix((a.data, a.indices, a.indptr), ... shape=(10000, 10020)) 10000 loops, best of 3: 48.2 us per loop 

Entonces, si ya no necesita su matriz original a , ya que el valor predeterminado es copy=False , simplemente haga lo siguiente:

 a = sps.csr_matrix((a.data, a.indices, a.indptr), shape=(10000, 10020)) 

Puedes usar scipy.sparse.vstack o scipy.sparse.hstack para hacerlo más rápido:

 from scipy.sparse import csr_matrix, vstack, hstack B = csr_matrix((5, 2), dtype=int) C = csr_matrix((5, 2), dtype=int) D = csr_matrix((10, 10), dtype=int) B2 = vstack((B, C)) #<10x2 sparse matrix of type '' # with 0 stored elements in COOrdinate format> hstack((B2, D)) #<10x12 sparse matrix of type '' # with 0 stored elements in COOrdinate format> 

Tenga en cuenta que la salida es un coo_matrix , que se puede convertir eficientemente a los formatos CSR o CSC .