什么是稀疏矩阵?

在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵。

作用:

在这种情况下,很多0值无疑是很浪费空间的,当我们要把数组存储在磁盘中时,可以用一个数组来存储它的有效信息,达到压缩数组的效果,节约空间。

处理方法:

1、记录数组一共有几行几列,有多少个不同的值。

2、把具有不通知的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。

图例:

  1. #稀疏数组
  2.  
  3. m = n = 6 #6X6二维数组
  4. arrys = [[0 for i in range(m)] for i in range(n)]
  5.  
  6. arrys[1][2] = 1 #数组赋值
  7. arrys[3][5] = 2
  8. """[[0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 2], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]"""
  9.  
  10. #自动生成稀疏数组
  11. line = len(arrys) #获取原数组行列数
  12. column = len(arrys[0])
  13.  
  14. value_count = 0 #值计数器
  15.  
  16. for i,v in enumerate(arrys): #循环数组每一个元素找到有多少个元素有值
  17. for ii,vv in enumerate(v):
  18. if vv:
  19. value_count += 1
  20.  
  21. """稀疏数组 : 有原数组的value个数+1 行,
  22. 有三列 其中第一行 也就是sparse_array[0]比较特别,sparse_array[0][0]表示原数组的行数 sparse_array[0][1]表示原数组的列数
  23. sparse_array[0][2]表示原数组的value个数。
  24. 其余稀疏数组的 每一行表示 一个原数组的value [x][0]代表这个元素位于原数组的行 [x][1]代表列 [x][2]代表value具体的值
  25.  
  26. """
  27. sparse_array = [[0 for i in range(value_count+1)] for i in range(3)] #创建稀疏数组
  28. sparse_array[0][0] = line
  29. sparse_array[0][1] = column
  30. sparse_array[0][2] = value_count
  31.  
  32. s_count = 1 #计数器
  33. for i,v in enumerate(arrys): #给稀疏数组赋值
  34. for ii,vv in enumerate(v):
  35. if vv:
  36. sparse_array[s_count][0] = i
  37. sparse_array[s_count][1] = ii
  38. sparse_array[s_count][2] = vv
  39. s_count += 1
  40. """sparse_array : [[6, 6, 2], [1, 2, 1], [3, 5, 2]]"""
  41.  
  42. #从稀疏数组还原到原数组
  43. old_arry = [[0 for i in range(sparse_array[0][0])] \
  44. for i in range(sparse_array[0][1])] #生成原二维数组
  45.  
  46. for k,val in enumerate(sparse_array):
  47. if k == 0:
  48. continue
  49. old_arry[val[0]][val[1]] = val[2]

稀疏数组 python描述的更多相关文章

  1. JAVA描述算法和数据结构(01):稀疏数组和二维数组转换

    本文源码:GitHub·点这里 || GitEE·点这里 一.基本简介 1.基础概念 在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵:与之相反, ...

  2. 读lodash源码之从slice看稀疏数组与密集数组

    卑鄙是卑鄙者的通行证,高尚是高尚者的墓志铭. --北岛<回答> 看北岛就是从这两句诗开始的,高尚者已死,只剩卑鄙者在世间横行. 本文为读 lodash 源码的第一篇,后续文章会更新到这个仓 ...

  3. Java数组声明创建和使用以及多维数组、Arrays类、稀疏数组

    目录 数组概述 数组声明创建 内存分析 java内存分析 堆 栈 方法区 三种初始化 静态初始化 动态初始化 数组的默认初始化 数组的四个基本特点 数组边界 小结: 数组使用 数组基础使用 For E ...

  4. Day9 数组 冒泡排序及稀疏数组!

    数组 数组是相同类型数据的有序集合. 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成. 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们.(下标从0开始) 数 ...

  5. 杂项之python描述符协议

    杂项之python描述符协议 本节内容 由来 描述符协议概念 类的静态方法及类方法实现原理 类作为装饰器使用 1. 由来 闲来无事去看了看django中的内置分页方法,发现里面用到了类作为装饰器来使用 ...

  6. new Array(n) 的坑 密集数组和稀疏数组

    今天写Vue时遇到一个奇怪问题,需要监控网页上的input 是否都有值 // var blanks = new Array(number); // blanks的监控属性 var emptyNumbe ...

  7. python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解

     1.前言 Python的描述符是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过google和阅读源码,现将自己的理解和心得记录下来,也为正在为了该问题 ...

  8. 【转载】Python 描述符简介

    来源:Alex Starostin 链接:www.ibm.com/developerworks/cn/opensource/os-pythondescriptors/ 关于Python@修饰符的文章可 ...

  9. python描述符descriptor(一)

    Python 描述符是一种创建托管属性的方法.每当一个属性被查询时,一个动作就会发生.这个动作默认是get,set或者delete.不过,有时候某个应用可能会有 更多的需求,需要你设计一些更复杂的动作 ...

随机推荐

  1. 使用JRebel插件实现SpringBoot应用代码热加载

    前言 在实际的开发过程中,我们经常修改代码之后,手动的重启项目,查看修改效果.那么有没有一种方式能够快速的.自动的帮我们将修改代码自动更新,避免手动重启,从而提高开发效率呢?是有的,在我之前的文章里面 ...

  2. 面试 LockSupport.park()会释放锁资源吗?

    (手机横屏看源码更方便) 引子 大家知道,我最近在招人,今天遇到个同学,他的源码看过一些,然后我就开始了AQS连环问. 我:说说AQS的大致流程? 他:AQS包含一个状态变量,一个同步队列--bala ...

  3. springboot使用spring配置文件

    1.如何在springboot中使用spring的配置文件,使用@Configuration和@ImportResource注解 package com.spring.task; import org ...

  4. SQL注入学习(一)

    SQL注入(SQL Injection)是一种常见的Web安全漏洞,攻击者利用这个漏洞,可以访问或修改数据,或者利用潜在的数据库漏洞进行攻击. SQL注入基础 漏洞原理 针对SQL注入的攻击行为可描述 ...

  5. day2------运算符和编码

    运算符和编码 一. 格式化输出 现在有以下需求,让用户输入name, age, job,Gender 然后输出如下所示: ------------ info of Yong Jie --------- ...

  6. C#开发命令执行驱动程序 之 控制标志的命令行参数

    /// <summary> /// 在cmd窗体内执行如下: /// CtrlOrderDrierApp.exe -f -t /// 返回: /// FOO /// Show Table ...

  7. 在SpringBoot中使用flyway进行数据库版本管理

    本文大纲 flyway是什么 能帮助我们解决什么问题 springboot环境下使用flyway flyway的工作原理 一.flyway是什么 Flyway是一个开源的数据库版本管理工具,并且极力主 ...

  8. 学 Python (Learn Python The Hard Way)

    学 Python (Learn Python The Hard Way) Contents: 译者前言 前言:笨办法更简单 习题 0: 准备工作 习题 1: 第一个程序 习题 2: 注释和井号 习题 ...

  9. java和Jvm目录

    回到占占推荐博客索引 主要介绍java基础知识,非框架类及JVM相关的内容文章 java和Jvm目录 Java~关于开发工具和包包 Java~类,抽象类和接口 Java~时间戳小知识 Java~命名规 ...

  10. 二:Mysql库相关操作

    1:系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等.performance_schema: My ...