什么是稀疏矩阵

  简单的说,如果一个矩阵中大部分元素为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. Codeforces Round #603 (Div. 2) E - Editor(线段树,括号序列)

  2. CF Educational Round 78 (Div2)题解报告A~E

    CF Educational Round 78 (Div2)题解报告A~E A:Two Rival Students​ 依题意模拟即可 #include<bits/stdc++.h> us ...

  3. [RN] React Native代码转换成微信小程序代码的转换引擎工具

    React Native代码转换成微信小程序代码的转换引擎工具 https://github.com/areslabs/alita

  4. sparksql基础知识一

    目标 掌握sparksql底层原理 掌握sparksql中DataFrame和DataSet的数据结构和使用方式 掌握通过sparksql开发应用程序 要点 1.sparksql概述 1.1 spar ...

  5. CSRF 跨站

    目录 CSRF 跨站请求伪造 解决跨站伪造问题: csrf 相关的装饰器: csrf.js文件: CSRF 跨站请求伪造 CSRF全称为Cross-site request forgery,也被称为: ...

  6. zabbix监控之zabbix-agent被动变为主动,搭建Proxy代理

    1.Agent被动变为主动:环境设定 base2 172.25.78.12 zabbix-serverbase3 172.25.78.13 zabbix-agent开启服务 # 在服务端[root@b ...

  7. Adobe Illustrator 入门 新建 保存图片

    下载 AI 的破解版 我这里用的是 Adobe_Illustrator CC 2019 Lite 精简特别版 V23.0.2 简体中文版 64位 安装略 新建文档 通常是 A4 图形绘制 选择 矩形工 ...

  8. tomcat Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

      1.情景展示 tomcat 日志时不时会报出如下异常信息,到底是怎么回事? java.lang.IllegalArgumentException: Invalid character found ...

  9. Android Q Beta 6 终极测试版发布!

    前言 当今手机市场可谓是百花齐放,但手机系统却屈指可数,其中Android和iOS就占据了整个手机系统市场的99%,单单Android就占据了整个手机系统市场的86%,可谓是占据绝对优势.     其 ...

  10. 【转】C# 对sqlite基本操作,带批量插入

    原文地址:https://download.csdn.net/download/mic_gary/10154869 public class SQLiteHelper { //数据库连接字符串 pub ...