在SciPy中,使用ix_()与稀疏矩阵似乎不起作用,还有什么可以用的?
在Numpy中,ix_()这个函数用来获取矩阵的行和列,但它似乎不适用于稀疏矩阵。比如,下面这段代码在使用密集矩阵时可以正常工作:
>>> import numpy as np
>>> x = np.mat([[1,0,3],[0,4,5],[7,8,0]])
>>> print x
[[1 0 3]
[0 4 5]
[7 8 0]]
>>> print x[np.ix_([0,2],[0,2])]
[[1 3]
[7 0]]
我用ix_()来索引与第0行和第2行、以及第0列和第2列对应的元素,这样就得到了矩阵的四个角。
问题是,ix_()似乎不适用于稀疏矩阵。接着之前的代码,我尝试了下面的代码:
>>> import scipy.sparse as sparse
>>> xspar = sparse.csr_matrix(x)
>>> print xspar
(0, 0) 1
(0, 2) 3
(1, 1) 4
(1, 2) 5
(2, 0) 7
(2, 1) 8
>>> print xspar[np.ix_([0,2],[0,2])]
结果却出现了一个很大的错误信息,提示有一个异常:
File "C:\Python26\lib\site-packages\scipy\sparse\compressed.py", line 138, in check_format
raise ValueError('data, indices, and indptr should be rank 1')
ValueError: data, indices, and indptr should be rank 1
我还尝试了SciPy提供的其他稀疏矩阵格式,但它们似乎都不支持ix_(),虽然并不是所有的都抛出同样的异常。
我给的例子使用的矩阵不大也不稀疏,但我现在处理的矩阵相当稀疏,而且可能非常大,所以逐个列出元素似乎不太明智。
有没有人知道在SciPy中用稀疏矩阵进行这种索引的(希望是简单的)方法,还是说这些稀疏矩阵根本就没有这个功能?
1 个回答
3
试试这个:
>>> print xspar
(0, 0) 1
(0, 2) 3
(1, 1) 4
(1, 2) 5
(2, 0) 7
(2, 1) 8
>>> print xspar[[[0],[2]],[0,2]]
(0, 0) 1
(0, 2) 3
(2, 0) 7
注意和这个的区别:
>>> print xspar[[0,2],[0,2]]
[[1 0]]