目录

什么是稀疏矩阵

稀疏矩阵的存储

示例题目

题目描述

输入/输出描述

代码

代码走读

传送门

测试用例

1. 数据正常且合乎要求:

2. 输入的行数或列数不大于0

3. 输入的行数或列数不是有效数字

4. 输入的元素不是有效数字

5. 稀疏数字占比低于稀疏比率


什么是稀疏矩阵

简单的说,如果一个矩阵中大部分元素为0,就被称为稀疏矩阵。

对于稀疏矩阵而言,实际存储的数据项很少。如果在计算机中采用传统的二维数组(在Python中使用二维列表)来存储稀疏矩阵,就会浪费大量的内存空间来存储0。比如一个10000 X 10000的稀疏矩阵,只有一个元素非0,若采用传统的存储技术,将浪费太多的内存来存储无意义的0。

稀疏矩阵的存储

对于稀疏矩阵,我们只需要记住矩阵中非0元素的位置和值、以及系数矩阵的大小(行数和列数)这些有用信息即可。也就是说,我们可以用一个包含3列的二维数组存储稀疏矩阵中的非0项,记录非0项的所在行、所在列和值信息以及记录稀疏矩阵行数和列数信息。

例如对于下面的3X3稀疏矩阵:

0 0 0
0 0 0
3 0 7

我们用下面的压缩矩阵来存储稀疏矩阵:

3  3 2
2 0 3
2 2 7

上面的压缩矩阵中,第0行(也就是标黄的部分)存储稀疏矩阵的行数(3)、列数(3)和非0项数据的个数(2)。

从第1行开始,存储非0项所在的行数、所在的列数和值。每一行存储一个非0项的信息。


示例题目

题目描述

输入一个稀疏矩阵,打印稀疏矩阵和压缩后的结果。

输入/输出描述

输入描述:

输入矩阵的行数和列数,在输入每一个位置对应的值。

例如下面输入了一个3 X 3的稀疏矩阵:

Input matrix rows: 3
Input matrix columns: 3
Input matrix[0][0]: 0
Input matrix[0][1]: 0
Input matrix[0][2]: 0
Input matrix[1][0]: 34
Input matrix[1][1]: 0
Input matrix[1][2]: 23
Input matrix[2][0]: 0
Input matrix[2][1]: 0
Input matrix[2][2]: 0

输出描述:

输出原矩阵和压缩后的稀疏矩阵:

------matrix------
|   0   0   0   |
|   34  0   23  |
|   0   0   0   |
---------------
After Compress matrix ---> sparse_matrix:
|   3   3   2   |
|   1   0   34  |
|   1   2   23  |

代码


# 声明稀疏元素和稀疏系数
SPARE_ELEMENT = 0
SPARE_RATE = 0.5class MatrixError(Exception):def __init__(self, message, code):self.message = messageself.code = codedef isSparse(matrix):"""Judge spare matrix.:param matrix: matrix:return: boolean"""sum = len(matrix) * len(matrix[0])spare = 0for row in range(len(matrix)):for column in range(len(matrix[row])):if matrix[row][column] == SPARE_ELEMENT:spare += 1if spare / sum >= SPARE_RATE:return Trueelse:return Falsedef print_matrix(matrix):"""print matrix.:param matrix: matrix:return: None"""for row in range(len(matrix)):message = "|\t"for column in range(len(matrix[row])):message += str(matrix[row][column]) + "\t"message += "|"print(message)return# 1. 输入矩阵
try:rows = int(input("Input matrix rows: "))if rows <= 0:raise MatrixError("MatrixError: Invalid param input rows: '%s'."" rows can not less than zero." % rows, 3001)columns = int(input("Input matrix columns: "))if columns <= 0:raise MatrixError("MatrixError: Invalid param input columns '%s'."" columns can not less than zero." % columns, 3002)except ValueError as e:print(str(e))print("Invalid param input. Please input integer for rows and columns.")exit()
except MatrixError as e:print("errcode: %s.\nerrmsg: %s" %(e.code, e.message))exit()try:matrix = [[SPARE_ELEMENT] * columns for row in range(rows)]valid_element_number = 0for row in range(rows):for column in range(columns):matrix[row][column] = int(input("Input matrix[%d][%d]: " % (row, column)))if matrix[row][column] != SPARE_ELEMENT:valid_element_number += 1
except Exception as e:print("Input Matrix Exception: %s" % str(e))exit()# 2. 校验稀疏矩阵
try:if not isSparse(matrix):raise MatrixError("MatrixError. Input matrix is not a sparse matrix.", 3003)
except MatrixError as e:print("errcode: %s.\nerrmsg: %s." % (e.code, e.message))exit()# 3. 压缩稀疏矩阵
spare_matrix = [[None] * 3 for i in range(valid_element_number + 1)]
spare_matrix[0][0] = rows
spare_matrix[0][1] = columns
spare_matrix[0][2] = valid_element_number
spare_pos = 0for row in range(rows):for column in range(columns):if matrix[row][column] != SPARE_ELEMENT:spare_pos += 1spare_matrix[spare_pos][0] = rowspare_matrix[spare_pos][1] = columnspare_matrix[spare_pos][2] = matrix[row][column]# 4. 打印结果:
print("------matrix------")
print_matrix(matrix)
print("---------------")
print("After Compress matrix ---> sparse_matrix: ")
print_matrix(spare_matrix)

代码走读

# 声明稀疏元素和稀疏系数。在本程序中,稀疏元素是0,稀疏系数是0.5(也就是说,当稀疏元素占总元素的比重小于稀疏系数时,代码判定该矩阵不为 # 稀疏矩阵)
SPARE_ELEMENT = 0
SPARE_RATE = 0.5# 定义矩阵异常(message表示异常信息,code表示错误码)
class MatrixError(Exception):def __init__(self, message, code):self.message = messageself.code = code# 判断输入的矩阵是否为稀疏矩阵
def isSparse(matrix):"""Judge spare matrix.:param matrix: matrix:return: boolean"""sum = len(matrix) * len(matrix[0])spare = 0for row in range(len(matrix)):for column in range(len(matrix[row])):if matrix[row][column] == SPARE_ELEMENT:spare += 1if spare / sum >= SPARE_RATE:return Trueelse:return False# 打印矩阵
def print_matrix(matrix):"""print matrix.:param matrix: matrix:return: None"""for row in range(len(matrix)):message = "|\t"for column in range(len(matrix[row])):message += str(matrix[row][column]) + "\t"message += "|"print(message)return# 程序开始的地方
# 1. 输入矩阵
# 这里输入矩阵的行数和列数
try:rows = int(input("Input matrix rows: "))if rows <= 0:raise MatrixError("MatrixError: Invalid param input rows: '%s'."" rows can not less than zero." % rows, 3001)columns = int(input("Input matrix columns: "))if columns <= 0:raise MatrixError("MatrixError: Invalid param input columns '%s'."" columns can not less than zero." % columns, 3002)# 当输入的行数和列数不为数字字符时捕获ValueError异常
except ValueError as e:print(str(e))print("Invalid param input. Please input integer for rows and columns.")exit()
# 捕获当输入的行数和列数小于等于0时所抛出的异常
except MatrixError as e:print("errcode: %s.\nerrmsg: %s" %(e.code, e.message))exit()# 根据输入的行数和列数输入矩阵每一个元素
try:matrix = [[SPARE_ELEMENT] * columns for row in range(rows)]valid_element_number = 0for row in range(rows):for column in range(columns):matrix[row][column] = int(input("Input matrix[%d][%d]: " % (row, column)))if matrix[row][column] != SPARE_ELEMENT:valid_element_number += 1
except Exception as e:print("Input Matrix Exception: %s" % str(e))exit()# 2. 校验稀疏矩阵,当判定不为稀疏矩阵时,抛出MatrixError异常
try:if not isSparse(matrix):raise MatrixError("MatrixError. Input matrix is not a sparse matrix.", 3003)
except MatrixError as e:print("errcode: %s.\nerrmsg: %s." % (e.code, e.message))exit()# 3. 压缩稀疏矩阵
# 声明稀疏矩阵,用None填充
spare_matrix = [[None] * 3 for i in range(valid_element_number + 1)]
# 稀疏压缩矩阵的首行,分别表示矩阵的行数、列数和非稀疏元素的个数
spare_matrix[0][0] = rows
spare_matrix[0][1] = columns
spare_matrix[0][2] = valid_element_number
spare_pos = 0# 遍历整个稀疏矩阵,并记录每一个非稀疏元素的行数、列数和值,并将其写入稀疏压缩矩阵中
for row in range(rows):for column in range(columns):if matrix[row][column] != SPARE_ELEMENT:spare_pos += 1spare_matrix[spare_pos][0] = rowspare_matrix[spare_pos][1] = columnspare_matrix[spare_pos][2] = matrix[row][column]# 4. 打印结果:
print("------matrix------")
print_matrix(matrix)
print("---------------")
print("After Compress matrix ---> sparse_matrix: ")
print_matrix(spare_matrix)

传送门

1. input()函数

Python input函数:接收标准输入数据_TCatTime的博客-CSDN博客

2. int()函数

Python int函数_TCatTime的博客-CSDN博客_int函数python

3. str()函数

Python str函数_TCatTime的博客-CSDN博客_python str函数

4. ValueError

Python异常 ValueError_TCatTime的博客-CSDN博客_python valueerror

5. print()函数

Python print函数:将内容打印输出_TCatTime的博客-CSDN博客_python 打印函数内容

6. range()函数

Python range函数_TCatTime的博客-CSDN博客_python的range方法

7. len()函数

Python len函数_TCatTime的博客-CSDN博客_len函数

测试用例

1. 数据正常且合乎要求:

Input matrix rows: 5
Input matrix columns: 3
Input matrix[0][0]: 0
Input matrix[0][1]: 0
Input matrix[0][2]: 0
Input matrix[1][0]: 0
Input matrix[1][1]: 13
Input matrix[1][2]: 0
Input matrix[2][0]: 0
Input matrix[2][1]: 0
Input matrix[2][2]: 6
Input matrix[3][0]: 0
Input matrix[3][1]: 0
Input matrix[3][2]: 0
Input matrix[4][0]: 9
Input matrix[4][1]: 0
Input matrix[4][2]: 0
------matrix------
|   0   0   0   |
|   0   13  0   |
|   0   0   6   |
|   0   0   0   |
|   9   0   0   |
---------------
After Compress matrix ---> sparse_matrix:
|   5   3   3   |
|   1   1   13  |
|   2   2   6   |
|   4   0   9   |

2. 输入的行数或列数不大于0

行数小于0

Input matrix rows: -2
errcode: 3001.
errmsg: MatrixError: Invalid param input rows: '-2'. rows can not less than zero.

列数小于0

Input matrix rows: 3
Input matrix columns: -9
errcode: 3002.
errmsg: MatrixError: Invalid param input columns '-9'. columns can not less than zero.

行数等于0

Input matrix rows: 0
errcode: 3001.
errmsg: MatrixError: Invalid param input rows: '0'. rows can not less than zero.

列数等于0

Input matrix rows: 8
Input matrix columns: 0
errcode: 3002.
errmsg: MatrixError: Invalid param input columns '0'. columns can not less than zero.

3. 输入的行数或列数不是有效数字

行数非有效数字:

Input matrix rows: K
invalid literal for int() with base 10: 'K'
Invalid param input. Please input integer for rows and columns.

列数非有效数字:

Input matrix rows: 5
Input matrix columns: G
invalid literal for int() with base 10: 'G'
Invalid param input. Please input integer for rows and columns.

4. 输入的元素不是有效数字

Input matrix rows: 3
Input matrix columns: 3
Input matrix[0][0]: 56
Input matrix[0][1]: gh
Input Matrix Exception: invalid literal for int() with base 10: 'gh'

5. 稀疏数字占比低于稀疏比率

当稀疏数字占总元素数量的比重低于稀疏比时,程序不认为这是一个稀疏矩阵,不会生成压缩后的稀疏矩阵。

Input matrix rows: 2
Input matrix columns: 2
Input matrix[0][0]: 45
Input matrix[0][1]: 56
Input matrix[1][0]: 0
Input matrix[1][1]: 67
errcode: 3003.
errmsg: MatrixError. Input matrix is not a sparse matrix..

稀疏矩阵(Python实现)相关推荐

  1. 一种比较省内存的稀疏矩阵Python存储方案

    原文:http://www.pythontab.com/html/2014/pythonhexinbiancheng_0522/788.html 推荐系统中经常需要处理类似user_id, item_ ...

  2. Python使用scipy包将稀疏矩阵保存为Mtx格式和npz格式文件实战

    Python使用scipy包将稀疏矩阵保存为Mtx格式和npz格式文件实战 目录 Python将稀疏矩阵保存为Mtx格式和npz格式文件实战 #导入包和仿真数据

  3. 稀疏矩阵之python实现

          工程实践中,多数情况下,大矩阵一般都为稀疏矩阵,所以如何处理稀疏矩阵在实际中就非常重要. 1.sparse模块初探 python中scipy模块中,有一个模块叫sparse模块,就是专门为 ...

  4. 洪嘉振 计算多体系统动力学pdf_多体动力学演化python入门——quantum many-body scars 和稀疏矩阵后续...

    好久没更新了,肚子里也没什么货,就算python稀疏矩阵的最后一篇吧.之前的 路飞的哥哥:多体物理python入门--Ising模型和稀疏矩阵​zhuanlan.zhihu.com 计算了本征值,也就 ...

  5. python 的csr_python的高级数组之稀疏矩阵

    稀疏矩阵的定义: 具有少量非零项的矩阵(在矩阵中,若数值0的元素数目远多于非0元素的数目,并且非0元素分布没有规律时,)则称该矩阵为稀疏矩阵:相反,为稠密矩阵.非零元素的总数比上矩阵所有元素的总数为矩 ...

  6. 如何用三元组表表示下列稀疏矩阵_盘一盘 Python 系列特别篇21之:SciPy 稀疏矩阵...

    引言 和稠密矩阵相比,稀疏矩阵的最大好处就是节省大量的内存空间来储存零.稀疏矩阵本质上还是矩阵,只不过多数位置是空的,那么存储所有的 0 非常浪费.稀疏矩阵的存储机制有很多种 (列出常用的五种): C ...

  7. matlab产生一个稀疏向量,Matlab中的稀疏矩阵向量乘法比Python快吗?

    编辑:请参阅this question,在那里我学习了如何使用Numba在Python中并行化稀疏矩阵向量乘法,并能够与Matlab打交道.在 原题: 我发现在Matlab中稀疏矩阵向量乘法比Pyth ...

  8. matlab对稀疏矩阵求特征值,使用ARPACK查找稀疏矩阵的特征向量和特征值(称为PYTHON,MATLAB或FORTRAN子例程)...

    几天前我问了一个如何找到大稀疏矩阵的特征值的问题 . 我没有答案,所以我决定描述一个潜在的解决方案 . One question remains: Can I use the python imple ...

  9. python稀疏矩阵的存储与表示

    参考链接: https://blog.csdn.net/bitcarmanlee/article/details/52668477 https://blog.csdn.net/wangjian1204 ...

  10. python中矩阵的表示方法,稀疏矩阵在Python中的表示方法

    对于一个矩阵而言,若数值为零的元素远远多于非零元素的个数,且非零元素分布没有规律时,这样的矩阵被称作稀疏矩阵:与之相反,若非零元素数目占据绝大多数时,这样的矩阵被称作稠密矩阵. 稀疏矩阵在工程应用中经 ...

最新文章

  1. SpringBoot+Mybatis+Swagger2环境搭建
  2. “35 岁才是一个程序员成熟的开始!”
  3. linux 死锁分析
  4. 启动mysql的innodb monitor功能
  5. php 在线繁体转换简体,php如何实现简体繁体转换
  6. PS Raw增效工具:Adobe Camera Raw13 for mac
  7. http dns django
  8. Spark之SparkSQL理论篇
  9. codis-server 集群安装及部署
  10. centos7 Samba服务安装和配置
  11. adams怎么打开自带模型_科研仿真之Adams入门篇
  12. word方框(□)打勾(√)方法
  13. c# RoundUp函数
  14. 跟我学-域名解析故障排查技巧
  15. Latex 公式被压扁过小
  16. python运行调出控制台_python控制台怎么打开
  17. eclipse Job
  18. 网络祭祀网站源码网上祭扫平台在线祭祀祭拜网上纪念馆扫墓phpcms网上墓园手机版源
  19. HBuilderX wifi无线真机调试
  20. Object的wait()和notify()以及notifyAll()和interrupt()方法

热门文章

  1. 2013各大互联网公司年终奖及薪资架构
  2. [Leetcode]5920. 分配给商店的最多商品的最小值
  3. 最美证件照加盟我们最终追求的是真实
  4. vue里面怎么实现页面跳转_vue.js怎样做跳转页面?
  5. vue使用动态组件实现TAB切换效果
  6. OpenFOAM编程基础(1) - Hello World
  7. 后盾人最新layUI前端框架使用详解_layUI前端框架视频教程
  8. 分糖果问题(java)
  9. 解决springcloud 中各服务之间调用外部依赖的clint api时,在调试时不方便的问题
  10. Windows下安装node.js(npm) git+vue