Python 二维数组和稀疏数组之间的转换

前言

用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
  • 在实战编程中,对于同样的效果可以采用不同的方法尝试。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nsq_ai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值