2011-07-21 39 views
4

我是Python的新手,所以如果这是一个基本问题,请提前原谅我,但是我已经搜索并没有找到令人满意的答案。在SciPy中,csr_matrices的花哨索引

我试图做的使用与NumPy和SciPy的以下内容:

I,J = x[:,0], x[:1]    # x is a two column array of (r,c) pairs 
V = ones(len(I)) 
G = sparse.coo_matrix((V,(I,J))) # G's dimensions are 1032570x1032570 
G = G + transpose(G) 
r,c = G.nonzero() 
G[r,c] = 1 
... 
NotImplementedError: Fancy indexing in assignment not supported for csr matrices 

好看多了,我希望所有的非零值,添加转后等于1,但我得到了花哨的索引错误消息。

或者,如果我能证明矩阵G是对称的,则不需要添加转置。

任何洞察任何方法将非常感激。

+0

如果您只想让所有内容都等于1,那么您只需执行'G = G/G' –

+0

辉煌。谢谢:) – will

回答

6

除了做类似G = G/G之外,您可以在G.data上操作。

所以,你的情况,无论是做:

G.data = np.ones(G.nnz) 

G.data[G.data != 0] = 1 

会做你想要什么。这是更灵活的,因为它允许您预成型其他类型的过滤器(例如G.data[G.data > 0.9] = 1G.data = np.random.random(G.nnz)

第二个选项只会将值设置为1,如果它们具有非零值。在一些计算过程中,您将得到零值“密集”(即它们实际存储为稀疏数组中的值)。 (您可以用G.eliminate_zeros()在原地删除这些文件)

+0

谢谢。那正是我所期待的。 – will