前言
用Python 实现二维数组和稀疏数组之间的转换
参考文章:
1.Java 二维数组和稀疏数组之间的转换述
1. 需求和思路分析
1.1 以二维数组的格式模拟棋盘、地图等类似的二维结构为基础,与稀疏数组之间进行转化
1.2 思路分析
-
二维数组转化为稀疏数组
- 遍历原始的二维数组,得到有效数据个数
- 根据有效个数就可以创建稀疏数组
- 将二维数组的有效数据存入到稀疏数组
-
稀疏数组转为二维数组
- 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
- 再读取稀疏数组后几行的数据,并赋给原始的二维数组即可。
2.代码实现和展示
2.1 二维数组与稀疏数组之间的转化程序
# 将二维数组转换为系数数组,再还原位二维数组
import numpy as np
# 一、二维数组转换为稀疏数组
# 1.创建二维数组、赋值, 11 * 11
# 二维数组的创建有三种方式:直接创建、列表、np.zeros
# 直接创建,11 * 11 太多了,不方便
# arr1 = [[0]*11 for i in range(11)]
arr1 = np.zeros(shape=(11,11),dtype=int)
arr1[1][2] = 1
arr1[2][3] = 2
print("原始的二维数组:")
print(arr1)
# 2、 统计二维数组有效数据的个数,作为稀疏数组的行数+1
count = 0
for i in range(len(arr1)):
for j in range(len(arr1[i])):
if arr1[i][j] != 0:
count += 1
# 3、建立稀疏数组,并赋值
sparse_arr1 = np.zeros(shape=(count+1,3),dtype=int)
sparse_arr1[0] = [11,11,count]
count1 = 1
for i in range(len(arr1)):
for j in range(len(arr1[i])):
if arr1[i][j] != 0:
sparse_arr1[count1] = [ i,j,arr1[i][j] ]
count1 +=1
# 4.输出稀疏数组
print("输出稀疏数组:")
print(sparse_arr1)
# 二、 将得到的稀疏数组再次还原为二维数组
# 1、稀疏数组采用上述
# 2、建立新的二维数组,赋值
arr2 = np.zeros(shape=(sparse_arr1[0][0],sparse_arr1[0][1]),dtype=int)
# for i in range(1,len(sparse_arr1)):
# arr2[sparse_arr1[i][0]][sparse_arr1[i][1]] = sparse_arr1[i][2]
for row in sparse_arr1[1:]:
arr2[row[0]][row[1]] = row[2]
print("还原后的二维数组为:")
print(arr2)
2.2 二维数组与稀疏数组转化展示
原始的二维数组:
[[0 0 0 0 0 0 0 0 0 0 0]
[0 0 1 0 0 0 0 0 0 0 0]
[0 0 0 2 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0]]
输出稀疏数组:
[[11 11 2]
[ 1 2 1]
[ 2 3 2]]
还原后的二维数组为:
[[0 0 0 0 0 0 0 0 0 0 0]
[0 0 1 0 0 0 0 0 0 0 0]
[0 0 0 2 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0]]
3. 总结
- Python中用
len()
测量数组的长度,Java中是length
- Python 的代码量远低于Java
- 在实战编程中,对于同样的效果可以采用不同的方法尝试。