首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >稀疏矩阵行中的连续元素

稀疏矩阵行中的连续元素
EN

Stack Overflow用户
提问于 2016-10-17 09:45:26
回答 2查看 201关注 0票数 1

我正在处理一个以COO格式存储的稀疏矩阵。获取每一行的连续元素数最快的方法是什么?

例如,考虑以下矩阵:

代码语言:javascript
复制
a = [[0,1,2,0],[1,0,0,2],[0,0,0,0],[1,0,1,0]]

它的首席运营官代表应该是

代码语言:javascript
复制
  (0, 1)    1
  (0, 2)    2
  (1, 0)    1
  (1, 3)    2
  (3, 0)    1
  (3, 2)    1

我需要结果是[1,2,0,2]。第一行包含两个位于附近的非零元素。因此,它是一个群体或集合。在第二行中,我们有两个非零的元素,但它们不在附近,因此我们可以说它形成了两个组。第三行没有非零,因此没有组。第四行又有两个非零,但由零nad分隔,因此我们认为是两个组。这将类似于每一行的集群数。迭代行是一个选项,但前提是没有更快的解决方案。在这方面的任何帮助都将受到赞赏。

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

代码语言:javascript
复制
[1,2,3,0,0,0,2,0,0,8,7,6,0,0]

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-17 16:47:07

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

  • 您需要每一行的组数。
  • 定义组时零计数
  • 行迭代对数组来说更快

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

代码语言:javascript
复制
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实现

代码语言:javascript
复制
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()可以很容易地从密集表单中获取列信息。

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

代码语言:javascript
复制
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的数量中获得所需的计数,尽管我需要查看更多的示例来定义细节。

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

票数 1
EN

Stack Overflow用户

发布于 2016-11-03 03:51:20

@hpaulj的注释的帮助下,我想出了以下代码片段来执行此操作:

代码语言:javascript
复制
    M = m.tolil()
r = []  
for i in range(M.shape[0]):
   sumx=0
   idx= M.rows[i]
   if (len(idx) > 2):
       tempidx = np.diff(idx)
       if (1 in tempidx):
           temp = filter(lambda a: a != 1, tempidx)
           sumx=1
       counts = len(temp)
       r.append(counts+sumx)
   elif (len(idx) == 2):
       tempidx = np.diff(idx)
       if(tempidx[0]==1):
           counts = 1
           r.append(counts)
       else:
           counts = 2
           r.append(counts)
   elif (len(idx) == 1):
       counts = 1
       r.append(counts) 
   else:
       counts = 0
       r.append(counts)
tempcluster = np.sum(r)/float(M.shape[0])
cluster.append(tempcluster)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40083118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档