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 = "|\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 的稀疏矩阵的更多相关文章
- python 多线程稀疏矩阵乘法
import threading, time import numpy as np res = [] class MyThread(threading.Thread): def __init__(se ...
- python的高级数组之稀疏矩阵
稀疏矩阵的定义: 具有少量非零项的矩阵(在矩阵中,若数值0的元素数目远多于非0元素的数目,并且非0元素分布没有规律时,)则称该矩阵为稀疏矩阵:相反,为稠密矩阵.非零元素的总数比上矩阵所有元素的总数为矩 ...
- 稀疏矩阵相乘-Python版
稀疏矩阵相乘-Python版 Given two sparse matrices A and B, return the r ...
- Python数据分析----scipy稀疏矩阵
一.sparse模块: python中scipy模块中,有一个模块叫sparse模块,就是专门为了解决稀疏矩阵而生.本文的大部分内容,其实就是基于sparse模块而来的 导入模块:from scipy ...
- 稀疏矩阵在Python中的表示方法
对于一个矩阵而言,若数值为零的元素远远多于非零元素的个数,且非零元素分布没有规律时,这样的矩阵被称作稀疏矩阵:与之相反,若非零元素数目占据绝大多数时,这样的矩阵被称作稠密矩阵. 稀疏矩阵在工程应用中经 ...
- 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 ...
- python中scipy学习——随机稀疏矩阵及操作
1.生成随机稀疏矩阵: scipy中生成随机稀疏矩阵的函数如下: scipy.sparse.rand(m,n,density,format,dtype,random_state) 1 参数介绍: 参数 ...
- Python 高维数组“稀疏矩阵”scipy sparse学习笔记
scipy 里面的sparse函数进行的矩阵存储 可以节省内存 主要是scipy包里面的 sparse 这里目前只用到两个 稀疏矩阵的读取 sparse.load() 转稀疏矩阵为普通矩阵 spars ...
- 利用Python进行数据分析(1) 简单介绍
一.处理数据的基本内容 数据分析 是指对数据进行控制.处理.整理.分析的过程. 在这里,“数据”是指结构化的数据,例如:记录.多维数组.Excel 里的数据.关系型数据库中的数据.数据表等. 二.说说 ...
随机推荐
- Spring Cloud微服务安全实战_2-1_开发环境
开发环境: JDK :1.8 IDE : idea 数据库:mysql 5.6.5 框架:springboot,mybatisplus PGA:(后边用到再安装) Promethus (普罗米修斯 ...
- postgresql plv8 安装
网上可以看到pg 9.6 版本的plv8容器镜像,没有pg 高版本的支持镜像,但是在基于原有dockerfile 进行构建的时候,居然失败了,有墙的问题,有版本的问题 所以通过虚拟机尝试下构建方式安装 ...
- postMessage的使用
一.简介 1.postMessage()方法允许来自不同源的脚本采用异步方式进行有限的通信,可以实现跨文本档.多窗口.跨域消息传递 2.postMessage(data,origin)方法接受两个参数 ...
- notapad++正则替换
1.替换小数点后一位 XP_001663106.2XP_001662510.3XP_001655249.2XP_001655248.1NP_001165739.1 \.[0-9]或者\.\d #第一个 ...
- C 题解———2019.10.16
现在很痛苦,等过阵子回头看看,会发现其实那都不算事. [题目描述]定义一个排列 a 的价值为满足|a[i]-i|<=1 的 i 的数量.给出三个正整数 n,m,p,求出长度为 n 且价值恰好为 ...
- PATB1009说反话
这里有一点需要注意的就是,PAT里面是禁用gets函数的,所以要换成一个替代函数 那就是下面这个: //这个是定义一个字符串数组 char str[90]; //需要被替代的函数 gets(str) ...
- iptables man手册翻译
概要 iptables [-t table] -[AD] chain rule-specification [options]iptables [-t table] -I chain [rulenum ...
- kubernetes 中遇见的一些坑(持续更新)
一.官网镜像无法下载 解决方法:需要翻墙 配置docker翻墙机: cat /usr/lib/systemd/system/docker.service [Service] Environment ...
- 【mysql】搜索带\字符
模糊查询 LIKE '%\\\%'
- python 在cmd时执行celery -A tasks worker --loglevel=info报错:failed to create process怎么解决
在cmd命令前加 : python -m 命令(如:python -m celery -A tasks worker --loglevel=info) -m: 将库中的python模块用作脚本去运行, ...