二维数组与稀疏数组的相互转换

1.稀疏数组(sparse array)介绍
含义:稀疏数组(sparse array)是一种只为数组中的非零元素分配内存的特殊类型数组,内存中存储了稀疏数组中非零元素的下标和值。
形式:三列、(count+1)行,其中count值非零元素个数
1)首行记录原数组的行数、列数和非0个数;
2)其余行用来记录数组中非零元素的下标值,首列记录行号,第2列记录列号,第3列记录数值。	
原数组
[[0. 1. 0. 0. 0. 0. 6. 0. 0. 0.]	
 [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 1. 0. 0. 0. 8. 0. 0.]
 [0. 0. 0. 0. 6. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 7. 0. 0. 0. 0.]
 [0. 0. 0. 9. 0. 0. 1. 0. 0. 0.]
 [0. 0. 8. 0. 0. 0. 0. 1. 0. 0.]
 [0. 0. 4. 0. 0. 0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 0. 0. 0. 0. 4. 0.]]
稀疏数组
[[10 10 15] #首行记录原数组的行数、列数和非0个数
 [ 0  1  1]
 [ 0  6  6]
 [ 1  2  1]
 [ 2  3  1]
 [ 2  7  8]
 [ 3  4  6]
 [ 4  5  7]
 [ 5  3  9]
 [ 5  6  1]
 [ 6  2  8]
 [ 6  7  1]
 [ 7  2  4]
 [ 7  8  1]
 [ 8  9  1]
 [ 9  8  4]]
2.代码实现
首先生成如上所示的原数组
import numpy as np
import random

array1 = np.eye(10, 10, k=1)
random.seed(0) #随机数种子,保证每次生成数组一样
for i in range(10):
    array1[i][random.randint(0, 9)] = random.randint(0, 9)
print(array1)
生成稀疏数组
步骤:
1.首先遍历原数组统计原数组中非零元素个数
2生成稀疏数组并赋值    
	2.1根据原数组中非零元素个数生成稀疏数组
	2.2给稀疏数组首行赋值
	2.3给稀疏数组其余各行赋值
# 1.首先遍历原数组统计原数组中非零元素个数
count = 0 #用来记录非零元素个数
for i in range(len(array1)):
    for j in range(len(array1[i])):
        if array1[i][j] != 0:
            count += 1
            
# 2生成稀疏数组并赋值    
# 2.1根据原数组中非零元素个数生成稀疏数组
sparse_array = np.zeros(shape=(count + 1, 3), dtype=int)
# 2.2给稀疏数组首行赋值
sparse_array[0] = [len(array1), len(array1[1]), count]
# 2.3给稀疏数组其余各行赋值
line = 0 #用来记录稀疏数组行数
for i in range(array1.shape[0]):
    for j in range(array1.shape[1]):
        if array1[i][j] != 0:
            line += 1
            sparse_array[line][0] = i #0列记录原数组行数
            sparse_array[line][1] = j #1列记录原数组列数
            sparse_array[line][2] = array1[i][j] #2列记录原数组元素的值
print(sparse_array)
还原为原数组
注意:我们是根据稀疏数组还原,不知道原数组的行数和列数
步骤
1.读取稀疏数组首行获取原数组的行数和列数,并各元素赋值为0
2.还原非零元素的值
# 1.读取稀疏数组首行获取原数组的行数和列数,并各元素赋值为0
array2 = np.zeros(shape=(sparse_array[0][0], sparse_array[0][1]))

# 2.还原非零元素的值
for row in sparse_array[1:]:
    # print(row)
    array2[row[0], row[1]] = row[2]
print(array2)
3.小结
NumPy库和random库的使用,数组的遍历和赋值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值