zoukankan      html  css  js  c++  java
  • Python 的稀疏矩阵

      什么是稀疏矩阵

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

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

      message += str(matrix[row][column]) + " "

      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. errmsg: %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. errmsg: %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 = "| "

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

      message += str(matrix[row][column]) + " "

      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. errmsg: %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. errmsg: %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..

  • 相关阅读:
    [转载] 浏览器渲染Rendering那些事:repaint、reflow/relayout、restyle
    JQuery 备忘
    HTML实体符号代码速查表(转载)
    37、IFE任务12——学习CSS 3的新特性
    36、IFE任务35——听指令的小方块(三)
    35、IFE任务34——听指令的小方块(二)
    34、互联网的三次革命及三个阶段
    33、任务三十三——棋盘的实现、正方体的移动效果
    32、任务三十二——实现表单工厂
    31、任务三十一——表单联动
  • 原文地址:https://www.cnblogs.com/djw12333/p/11459011.html
Copyright © 2011-2022 走看看