abumelq 2022-01-05 17:26 采纳率: 100%
浏览 99
已结题

大型稀疏矩阵的遍历和计算

问题遇到的现象和发生背景

有一个(3783x3783)的二维稀疏矩阵matrix,数值只有1、-1、0这三种,其中0占据很大一部分。我想计算的是遍历元素,并计算最后的结果。最简单且最耗时的是最开始写了一个三层for循环,计算了两个小时都还没出现一个进度条。具体代码如下:

for i in range(0, N - 2):
    for j in range(i + 1, N - 1):
        for k in range(j + 1, N):
            a = matrix[i][j]
            b = matrix[i][k]
            c = matrix[j][k]
            if ((a != 0) and (b != 0) and (c != 0)):
                d = a + b + c
                if (d == 3 or d == -1):
                    balance = balance + 1
                else:
                    unbalance = unbalance + 1

于是改为稀疏矩阵,因为稀疏矩阵中只存储了有效值,所有想着没有存储到的值就等于0。虽然用了稀疏矩阵,但是发现计算还是很忙,跑了一个小时左右也没出现一点结果。具体代码如下:

ma = csr_matrix(matrix)
for i in range(0, N - 2):
    for j in range(i + 1, N - 1):
        for k in range(j + 1, N):
            a = ma.__getitem__((i,j))
            b = ma.__getitem__((i,k))
            c = ma.__getitem__((j,k))
            if ((a != 0) and (b != 0) and (c != 0)):
                d = a + b + c
                if (d == 3 or d == -1):
                    balance = balance + 1
                else:
                    unbalance = unbalance + 1

总体要计算的就是balance和unbalance的值。怀疑是不是三层for循环的原因,但是遍历就在那儿,不好改for循环。所以想请教一下大家有什么好的方法么?感谢感谢!

  • 写回答

1条回答 默认 最新

  • 天元浪子 Python领域优质创作者 2022-01-05 23:20
    关注

    不至于这么慢吧?简单写个demo,瞬间完成,仅供参考。

    >>> import numpy as np
    >>> data = np.random.randint(-1, 2, (3783,3783)) # 模拟测试数据
    >>> a = data[:-2, 1:-1]
    >>> b = data[:-2, 2:]
    >>> c = data[1:-1, 2:]
    >>> d = a + b + c
    >>> d = d[(a!=0)&(b!=0)&(c!=0)]
    >>> balance = d[(d==3)|(d==-1)].shape[0]
    >>> unbalance = d.shape[0] - balance
    >>> balance, unbalance
    (2118421, 2116393)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏

报告相同问题?

问题事件

  • 系统已结题 1月14日
  • 已采纳回答 1月6日
  • 创建了问题 1月5日

悬赏问题

  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程