在SciPy中,使用ix_()与稀疏矩阵似乎不起作用,还有什么可以用的?

3 投票
1 回答
1655 浏览
提问于 2025-04-15 19:44

在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]]

撰写回答