如何对scipy稀疏矩阵采样部分行以生成新的scipy稀疏矩阵
如何对Scipy稀疏矩阵进行行采样并生成新的稀疏矩阵
这个问题其实很好解决,Scipy的稀疏矩阵支持和NumPy数组类似的索引操作,不过有个小细节要注意——选对矩阵格式能让行采样更高效。
核心步骤
优先转换为CSR格式
CSR(Compressed Sparse Row)格式是专门为行操作优化的,如果你原矩阵是其他格式(比如CSC、COO),建议先转成CSR,这样行切片的速度会快很多:import scipy.sparse as sp # 假设你的原矩阵是A,转换为CSR格式 A_csr = A.tocsr()直接通过索引提取目标行
和NumPy数组一样,你可以用列表指定要提取的行索引(注意:Python是0-based索引,也就是第一行对应索引0)。比如你说的10行矩阵,要提取日常计数的第1、3、4行,对应0-based的索引就是[0, 2, 3];如果是按0-based计数的第1、3、4行,直接用[1, 3, 4]即可。示例代码:
# 先创建一个10行的示例稀疏矩阵(方便你测试) A = sp.random(10, 5, density=0.2, format='csr') # 指定要提取的行(这里用0-based的[0,2,3]对应日常的第1、3、4行) selected_row_indices = [0, 2, 3] # 提取行生成新的稀疏矩阵B B = A[selected_row_indices, :]验证结果
你可以打印新矩阵的形状来确认是否正确:print(B.shape) # 输出应该是(3, 5),对应3行5列的稀疏矩阵
额外提示
- 如果要提取连续的行,比如第2到第5行(0-based是1到4),可以直接用切片:
B = A[1:5, :] - 如果你的矩阵已经是CSR格式,直接跳过转换步骤就行;CSC格式虽然也支持行切片,但效率会低一些,因为它是按列存储的。
内容的提问来源于stack exchange,提问作者Sujay_K
相关产品推荐
相关产品推荐

