通过添加列简单扩展csr矩阵

时间:2016-06-20 07:52:42

标签: python numpy data-science

我有这段代码

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改变类型)

1 个答案:

答案 0 :(得分:1)

sparse.hstack的代码是

return bmat([blocks], format=format, dtype=dtype)

代表bmat,然后blocks1xN数组。如果它们都是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)

换句话说,它获取每个块的datarowcol值,连接它们,创建一个新的coo矩阵,最后将其转换为欲望格式。

sparse可以轻松转换格式。即使矩阵的显示也可能涉及转换 - 为(i,j) d格式转换为csr为密集/数组。 sparse.nonzero转换为coo。大多数数学转换为csr。通过将csr转换为csc(不更改属性数组)来转置csr。大部分转换是在编译代码中完成的,因此您不会看到延迟。

直接将列添加到mv x y 格式是很多工作。必须逐行修改所有3个属性数组。如果需要,我可以再详细说明。