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

2024-04-25 09:25:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个密码

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的类型)


Tags: fromimportnumpy密码类型asnpones
1条回答
网友
1楼 · 发布于 2024-04-25 09:25:51

sparse.hstack的代码是

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

对于bmat,则blocks1xN数组。如果它们都是csc,它将执行堆栈的快速版本:

^{pr2}$

相反地,sparse.vstackcsr矩阵相同

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格式需要大量的工作。所有3个属性数组都必须逐行修改。如果需要的话,我可以再次详细说明。在

相关问题 更多 >