什么是稀疏矩阵

  简单的说,如果一个矩阵中大部分元素为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.5

  class MatrixError(Exception):

  def __init__(self, message, code):

  self.message = message

  self.code = code

  def isSparse(matrix):

  """

  Judge spare matrix.

  :param matrix: matrix

  :return: boolean

  """

  sum = len(matrix) * len(matrix[0])

  spare = 0

  for row in range(len(matrix)):

  for column in range(len(matrix[row])):

  if matrix[row][column] == SPARE_ELEMENT:

  spare += 1

  if spare / sum >= SPARE_RATE:

  return True

  else:

  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)

  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 = 0

  for 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 = 0

  for row in range(rows):

  for column in range(columns):

  if matrix[row][column] != SPARE_ELEMENT:

  spare_pos += 1

  spare_matrix[spare_pos][0] = row

  spare_matrix[spare_pos][1] = column

  spare_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 = message

  self.code = code

  # 判断输入的矩阵是否为稀疏矩阵

  def isSparse(matrix):

  """

  Judge spare matrix.

  :param matrix: matrix

  :return: boolean

  """

  sum = len(matrix) * len(matrix[0])

  spare = 0

  for row in range(len(matrix)):

  for column in range(len(matrix[row])):

  if matrix[row][column] == SPARE_ELEMENT:

  spare += 1

  if spare / sum >= SPARE_RATE:

  return True

  else:

  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 = 0

  for 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 += 1

  spare_matrix[spare_pos][0] = row

  spare_matrix[spare_pos][1] = column

  spare_matrix[spare_pos][2] = matrix[row][column]

  # 4. 打印结果:

  print("------matrix------")

  print_matrix(matrix)

  print("---------------")

  print("After Compress matrix ---> sparse_matrix: ")

  print_matrix(spare_matrix)

  传送门无锡做人流需要多少钱 http://www.xasgfk120.com/

  1. input()函数

  https://blog.csdn.net/TCatTime/article/details/82556033

  2. int()函数

  https://blog.csdn.net/TCatTime/article/details/82826824

  3. str()函数

  https://blog.csdn.net/TCatTime/article/details/82963437

  4. ValueError

  https://blog.csdn.net/TCatTime/article/details/88085292

  5. print()函数

  https://blog.csdn.net/TCatTime/article/details/83450692

  6. range()函数

  https://blog.csdn.net/TCatTime/article/details/82941022

  7. len()函数

  https://blog.csdn.net/TCatTime/article/details/82469297

  测试用例

  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 多线程稀疏矩阵乘法

    import threading, time import numpy as np res = [] class MyThread(threading.Thread): def __init__(se ...

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

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

  3. 稀疏矩阵相乘-Python版

                                          稀疏矩阵相乘-Python版 Given two sparse matrices A and B, return the r ...

  4. Python数据分析----scipy稀疏矩阵

    一.sparse模块: python中scipy模块中,有一个模块叫sparse模块,就是专门为了解决稀疏矩阵而生.本文的大部分内容,其实就是基于sparse模块而来的 导入模块:from scipy ...

  5. 稀疏矩阵在Python中的表示方法

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

  6. python稀疏矩阵得到每列最大k项的值,对list内为类对象的排序(scipy.sparse.csr.csr_matrix)

    print(train_set.tdm) print(type(train_set.tdm)) 输出得到: (0, 3200) 0.264940780338 (0, 1682) 0.356545827 ...

  7. python中scipy学习——随机稀疏矩阵及操作

    1.生成随机稀疏矩阵: scipy中生成随机稀疏矩阵的函数如下: scipy.sparse.rand(m,n,density,format,dtype,random_state) 1 参数介绍: 参数 ...

  8. Python 高维数组“稀疏矩阵”scipy sparse学习笔记

    scipy 里面的sparse函数进行的矩阵存储 可以节省内存 主要是scipy包里面的 sparse 这里目前只用到两个 稀疏矩阵的读取 sparse.load() 转稀疏矩阵为普通矩阵 spars ...

  9. 利用Python进行数据分析(1) 简单介绍

    一.处理数据的基本内容 数据分析 是指对数据进行控制.处理.整理.分析的过程. 在这里,“数据”是指结构化的数据,例如:记录.多维数组.Excel 里的数据.关系型数据库中的数据.数据表等. 二.说说 ...

随机推荐

  1. python基础之四:list、tuple

    一.列表 list # 列表 ''' 类似str,可以进行切片 ''' li = [', [1, 2, 3], 55, 'we all in ', 'Tom', ''] print(li[0:2]) ...

  2. MacOS下IDEA设置智能提示不区分大小写

    本文只针对,IDEA-2019.2.3版本 目录地址: Edit -> General -> Code Completion -> Match case -> 勾选去掉 截图如 ...

  3. Layui 模板引擎中的 日期格式化

    原文:https://www.jianshu.com/p/948a474b5ed7 原文:https://blog.csdn.net/DCFANS/article/details/92064112 模 ...

  4. 【luoguP1533】可怜的狗狗

    题目链接 发现区间按左端点排序后右端点也是单调的,所以扫一遍就行了,用权值线段树维护第\(k\)大 #include<algorithm> #include<iostream> ...

  5. 原生js给同一对象绑定多个事件

    事件监听 var son = document.querySelector(".son"); son.addEventListener('click', once1); funct ...

  6. linux脚本中有source相关命令时的注意事项

    写这个问题起因是因为一个同学去的java一键脚本环境变量设置问题, [root@localhost u01]# more 1.sh #!/bin/bash grep -q "export J ...

  7. python 之类的继承

    #类的继承 class As1(): def As2(self): print("he11...") class As2(As1): def As2(self): print(&q ...

  8. 7种 JVM 垃圾收集器特点、优劣势及使用场景(多图)

    7种 JVM 垃圾收集器特点.优劣势及使用场景(多图)  mp.weixin.qq.com 点击上方"IT牧场",选择"设为星标"技术干货每日送达! 一.常见垃 ...

  9. 《Linux就该这么学》培训笔记_ch13_使用Bind提供域名解析服务

    <Linux就该这么学>培训笔记_ch13_使用Bind提供域名解析服务 文章最后会post上书本的笔记照片. 文章主要内容: DNS域名解析服务 安装并部署Bind服务程序 部署从服务器 ...

  10. Kafka支持单集群20万分区

    Kafka支持单集群20万分区 之前网上关于确定Kafka分区数的博客多多少少都源自于饶军大神的文章,如今他带来了这方面的第二篇文章,特此翻译一下,记录一下其中的要点. 原贴地址: https://w ...