gpt4 book ai didi

python - 稀疏矩阵行中的连续元素

转载 作者:太空宇宙 更新时间:2023-11-03 16:03:26 25 4
gpt4 key购买 nike

我正在研究以 COO 格式存储的稀疏矩阵。获取每行连续元素数量的最快方法是什么。

例如,考虑以下矩阵:

a = [[0,1,2,0],[1,0,0,2],[0,0,0,0],[1,0,1,0]]

其首席运营官代表将是

  (0, 1)    1
(0, 2) 2
(1, 0) 1
(1, 3) 2
(3, 0) 1
(3, 2) 1

我需要结果为[1,2,0,2]。第一行包含两个位于附近的非零元素。因此它是一个组或一组。在第二行中,我们有两个非零元素,但它们并不位于附近,因此我们可以说它形成了两组。第三行没有非零,因此没有组。第四行再次有两个非零,但由零分隔,因此我们将其视为两组。这就像每行的簇数。迭代行是一种选择,但前提是没有更快的解决方案。感谢这方面的任何帮助。

另一个简单的例子:考虑下面的行:

[1,2,3,0,0,0,2,0,0,8,7,6,0,0]

上面的行应该返回[3],因为有三组非零被零分隔。

最佳答案

将其转换为密集数组,并逐行应用逻辑。

  • 您想要每行的组数
  • 定义组时计数为零
  • 使用数组进行行迭代速度更快

coo 格式中,您的矩阵如下所示:

In [623]: M=sparse.coo_matrix(a)
In [624]: M.data
Out[624]: array([1, 2, 1, 2, 1, 1])
In [625]: M.row
Out[625]: array([0, 0, 1, 1, 3, 3], dtype=int32)
In [626]: M.col
Out[626]: array([1, 2, 0, 3, 0, 2], dtype=int32)

该格式不实现行索引; csrlil

In [627]: M.tolil().data
Out[627]: array([[1, 2], [1, 2], [], [1, 1]], dtype=object)
In [628]: M.tolil().rows
Out[628]: array([[1, 2], [0, 3], [], [0, 2]], dtype=object)

因此,第一行的稀疏信息是非零数据值列表 [1,2] 及其列号列表 [1,2]。将其与密集数组的行 [0, 1, 2, 0] 进行比较。哪个更容易分析?

您的第一个任务是编写一个分析一行的函数。我还没有充分研究你的逻辑,无法判断密集形式是否比稀疏形式更好。使用 M.A[0,:].nonzero() 可以轻松从密集形式中获取列信息。

在你的最后一个例子中,我可以获得非零索引:

In [631]: np.nonzero([1,2,3,0,0,0,2,0,0,8,7,6,0,0])
Out[631]: (array([ 0, 1, 2, 6, 9, 10, 11], dtype=int32),)
In [632]: idx=np.nonzero([1,2,3,0,0,0,2,0,0,8,7,6,0,0])[0]
In [633]: idx
Out[633]: array([ 0, 1, 2, 6, 9, 10, 11], dtype=int32)
In [634]: np.diff(idx)
Out[634]: array([1, 1, 4, 3, 1, 1], dtype=int32)

我们也许能够从 diff>1 的数量中获得所需的计数,尽管我必须查看更多示例来定义详细信息。

将分析扩展到多行取决于首先彻底理解单行情况。

关于python - 稀疏矩阵行中的连续元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40083118/

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