gpt4 book ai didi

python - 忽略稀疏矩阵中的重复条目

转载 作者:太空狗 更新时间:2023-10-29 21:42:57 24 4
gpt4 key购买 nike

我已尝试从 (data, (rows, cols)) 值列表中初始化 csc_matrixcsr_matrix 作为文档建议。

sparse = csc_matrix((data, (rows, cols)), shape=(n, n))

问题是,我实际拥有的用于生成 datarowscols 向量的方法在某些点上引入了重复项。默认情况下,scipy 添加重复条目的值。但是,就我而言,对于给定的 (row, col),这些重复项在 data 中具有完全相同的值。

我想要实现的是让 scipy 忽略第二个条目(如果已经存在),而不是添加它们。

忽略我可以改进生成算法以避免生成重复项这一事实,是否有参数或其他方法来创建忽略重复项的稀疏矩阵?

目前有两个条目 data = [4, 4];列 = [1, 1]; rows = [1, 1]; 生成一个稀疏矩阵,其 (1,1) 处的值为 8 而所需值为 4.

>>> c = csc_matrix(([4, 4], ([1,1],[1,1])), shape=(3,3))
>>> c.todense()
matrix([[0, 0, 0],
[0, 8, 0],
[0, 0, 0]])

我也知道我可以使用二维 numpy unique 函数来过滤它们,但是列表非常大,所以这不是一个真正有效的选项。

问题的其他可能答案:是否有任何方法可以指定如何处理重复项?即保留 minmax 而不是默认的 sum?

最佳答案

创建中间 dok 矩阵适用于您的示例:

In [410]: c=sparse.coo_matrix((data, (cols, rows)),shape=(3,3)).todok().tocsc()

In [411]: c.A
Out[411]:
array([[0, 0, 0],
[0, 4, 0],
[0, 0, 0]], dtype=int32)

coo 矩阵将您的输入数组放入其datacolrow 属性中,而无需更改。在转换为 csc 之前不会进行求和。

todok 直接从 coo 属性加载字典。它创建空白的 dok 矩阵,并填充它:

dok.update(izip(izip(self.row,self.col),self.data))

所以如果有重复的 (row,col) 值,它就是最后一个剩下的值。这使用标准的 Python 字典哈希来查找唯一键。


这是使用np.unique 的一种方式。我必须构造一个特殊的对象数组,因为 unique 对 1d 进行操作,而我们有一个 2d 索引。

In [479]: data, cols, rows = [np.array(j) for j in [[1,4,2,4,1],[0,1,1,1,2],[0,1,2,1,1]]]

In [480]: x=np.zeros(cols.shape,dtype=object)

In [481]: x[:]=list(zip(rows,cols))

In [482]: x
Out[482]: array([(0, 0), (1, 1), (2, 1), (1, 1), (1, 2)], dtype=object)

In [483]: i=np.unique(x,return_index=True)[1]

In [484]: i
Out[484]: array([0, 1, 4, 2], dtype=int32)

In [485]: c1=sparse.csc_matrix((data[i],(cols[i],rows[i])),shape=(3,3))

In [486]: c1.A
Out[486]:
array([[1, 0, 0],
[0, 4, 2],
[0, 1, 0]], dtype=int32)

我不知道哪种方法更快。


根据 liuengo 的 链接获取唯一索引的另一种方法:

rc = np.vstack([rows,cols]).T.copy()
dt = rc.dtype.descr * 2
i = np.unique(rc.view(dt), return_index=True)[1]

rc 必须拥有自己的数据才能通过 View 更改数据类型,因此 .T.copy()

In [554]: rc.view(dt)
Out[554]:
array([[(0, 0)],
[(1, 1)],
[(2, 1)],
[(1, 1)],
[(1, 2)]],
dtype=[('f0', '<i4'), ('f1', '<i4')])

关于python - 忽略稀疏矩阵中的重复条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28677162/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com