我有这段代码
import numpy as np
from scipy.sparse import csr_matrix
q = csr_matrix([[1.], [0.]])
ones = np.ones((2, 1))
现在如何将一列添加到矩阵q以得到结果形状(2,2)? (矩阵q很稀疏,我不想从csr改变类型)
答案 0 :(得分:1)
sparse.hstack
的代码是
return bmat([blocks], format=format, dtype=dtype)
代表bmat
,然后blocks
是1xN
数组。如果它们都是csc
,它会执行快速版本的堆栈:
A = _compressed_sparse_stack(blocks[0,:], 1)
相反sparse.vstack
csr
矩阵
A = _compressed_sparse_stack(blocks[:,0], 0)
实际上,如果数据存储在csr
矩阵中,则添加行(或csc
列)相对容易(我可以详细说明是否需要解释)。
否则bmat
会:
# convert everything to COO format
# calculate total nnz
data = np.empty(nnz, dtype=dtype)
for B in blocks:
data[nnz:nnz + B.nnz] = B.data
return coo_matrix((data, (row, col)), shape=shape).asformat(format)
换句话说,它获取每个块的data
,row
,col
值,连接它们,创建一个新的coo
矩阵,最后将其转换为欲望格式。
sparse
可以轻松转换格式。即使矩阵的显示也可能涉及转换 - 为(i,j) d
格式转换为csr为密集/数组。 sparse.nonzero
转换为coo
。大多数数学转换为csr
。通过将csr
转换为csc
(不更改属性数组)来转置csr
。大部分转换是在编译代码中完成的,因此您不会看到延迟。
直接将列添加到mv x y
格式是很多工作。必须逐行修改所有3个属性数组。如果需要,我可以再详细说明。