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 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给稀疏数组其余各行赋值
count = 0
for i in range ( len ( array1) ) :
for j in range ( len ( array1[ i] ) ) :
if array1[ i] [ j] != 0 :
count += 1
sparse_array = np. zeros( shape= ( count + 1 , 3 ) , dtype= int )
sparse_array[ 0 ] = [ len ( array1) , len ( array1[ 1 ] ) , count]
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
sparse_array[ line] [ 1 ] = j
sparse_array[ line] [ 2 ] = array1[ i] [ j]
print ( sparse_array)
还原为原数组
注意:我们是根据稀疏数组还原,不知道原数组的行数和列数
步骤
1.读取稀疏数组首行获取原数组的行数和列数,并各元素赋值为0
2.还原非零元素的值
array2 = np. zeros( shape= ( sparse_array[ 0 ] [ 0 ] , sparse_array[ 0 ] [ 1 ] ) )
for row in sparse_array[ 1 : ] :
array2[ row[ 0 ] , row[ 1 ] ] = row[ 2 ]
print ( array2)
3.小结
NumPy库和random库的使用,数组的遍历和赋值。