首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >枕:稀疏矩阵到ndarray

枕:稀疏矩阵到ndarray
EN

Stack Overflow用户
提问于 2013-11-02 00:06:04
回答 2查看 1.8K关注 0票数 1

我有一个CSC格式的矩阵A,其中我只索引了一列

代码语言:javascript
代码运行次数:0
运行
复制
b = A[:,col]

产生(Nx1)矩阵。我想做的是:

代码语言:javascript
代码运行次数:0
运行
复制
v  = M * b

其中M是CSR中的( n )矩阵。结果v是一个(Nx1)CSR-矩阵.我需要迭代v中的值(实际上不包括0),并检索满足特殊条件的一个元素的索引(注意:没有选择稀疏矩阵格式来适应特定的操作,但是一般的矩阵x矩阵-积应该是CSR * CSC最快的,对吗?)

问题是,迭代CSR格式向量(0

有人能告诉我如何执行这些操作吗?这样我就可以快速地迭代结果向量,从而使与复制相关的内存开销保持在较小的范围内?

代码语言:javascript
代码运行次数:0
运行
复制
IN: M (CSR-Matrix), A (CSC-Matrix), col_index
v = M * A[:,col_index]
for entries in v:
    do stuff

也有可能以某种方式加快CSC中列的“高级”索引吗?在代码的另一点上,我必须提取A的一个子矩阵(不能被重新构造为允许切片,因此使用索引数组),它包括所有列的一个给定子集。当行分析时,idxlist需要相当长的时间.

期待你的建议

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-02 01:16:24

每个版本都会使can稀疏模块变得更好,但是很明显,它正在进行中,所以可以通过直接访问对象的内部来进行许多优化。例如,你的案件:

代码语言:javascript
代码运行次数:0
运行
复制
>>> a = sps.rand(5, 20, density=0.2, format='csr')
>>> b = sps.rand(20, 1, density=0.2, format='csc')
>>> c = a * b
>>> c.A
array([[ 0.30331594],
       [ 0.        ],
       [ 0.12198742],
       [ 0.34350077],
       [ 0.        ]])

您可以将c的非零项作为c.data

代码语言:javascript
代码运行次数:0
运行
复制
>>> c.data
array([ 0.30331594,  0.12198742,  0.34350077])

获取相应的行号要复杂一些。可能最简单的方法是将输出转换为CSC格式,因为它们直接以c.indices的形式存在,而c.data仍然与以前一样:

代码语言:javascript
代码运行次数:0
运行
复制
>>> c.tocsc().indices
array([0, 2, 3])
>>> c.tocsc().data
array([ 0.30331594,  0.12198742,  0.34350077])

但是,如果您不喜欢它们,则可以在不执行转换的情况下提取它们:

代码语言:javascript
代码运行次数:0
运行
复制
>>> np.where(c.indptr[:-1] != c.indptr[1:])[0]
array([0, 2, 3], dtype=int64)

因此,如果您想查找(例如,最大值及其行号),您可以:

代码语言:javascript
代码运行次数:0
运行
复制
>>> row_idx = np.where(c.indptr[:-1] != c.indptr[1:])[0]
>>> idx = np.argmax(c.data)
>>> c.data[idx], row_idx[idx]
(0.34350077450601624, 3)
票数 1
EN

Stack Overflow用户

发布于 2013-11-02 02:40:20

在代码审查问题中,我正在探索加速稀疏矩阵https://codereview.stackexchange.com/questions/32664/numpy-scipy-optimization/33566#33566行的迭代的方法

csr getrow令人惊讶地慢了下来。至少对于这个小的测试用例,将稀疏矩阵转换为密集数组并使用常规的numpy索引(使用np.nonzero获取稀疏条目)速度更快。同样快的是将矩阵转换为lil,并在zip(X.data, X.rows)上执行常规的Python迭代。

我的印象是,scipy.sparse对线性代数问题最好,而对于索引和迭代则比较慢。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19737401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档