1. 选择下载好的所有指数(假设为10个指数),保证所有的数据大小都是一致的,
假设是500*300,读取所有指数,形成500*300*10的数组。
import cv2 # opencv读取格式是BGR
import os
import numpy as np
import tifffile as tf # tifffile是tiff文件的读取库
import random
def cv_show(name, img): # 定义展示图片的函数
cv2.namedWindow(name, 0)
cv2.imshow(name, img)
cv2.waitKey(0)
cv2.destroyAllWindows()
data_path = 'H:\gee_image\mean'
img_list = os.listdir(data_path) # img_list:所有指数的图像文件名
data_list = [] # 存放所有指数的图像的矩阵集合
data_array = np.zeros((8, 612, 609)) # 新建三维数组,且初始值为0,存放所有指数的图像的矩阵集合
index = -1
for img in img_list: # img:一个图像文件名
print(img)
temp_tf = tf.imread(f'{data_path}//{img}') # img:一个指数图像的矩阵
temp_tf[np.isnan(temp_tf)] = 0 # 只要有一个nan,计算出来的就都是nan,此处将nan转为0
print(temp_tf.shape)
data_list.append(temp_tf) # 将所有指数图像矩阵加入data_collection
index = index + 1
data_array[index] = temp_tf
print(len(data_list)) # 加入一张图像矩阵打印一次集合长度,最后为图像总数
2. 读取对应范围的SPEI数据,得到500*300的数组。
spei_path = 'H:\gee_image\spei_hunan.tif'
spei_array = tf.imread(f'{spei_path}') # img:一个指数图像的矩阵
spei_array[np.isnan(spei_array)] = 0 # 只要有一个nan,计算出来的就都是nan,此处将nan转为0
print('spei_hunan.tif')
print(spei_array.shape)
3. 随机生成10000个像素坐标,然后读取每个像素坐标上的指数的值,得到10000*10的数组,
然后读取SPEI数据上对应的10000个像素的值,得到10000*1的数组。形成训练样本。
4. 在剩下的位置随机生成20000个像素坐标,然后读取每个像素坐标上的指数的值,得到20000*10的数组,
然后读取SPEI数据上对应的20000个像素的值,得到20000*1的数组。形成测试样本。
# 利用random.sample()和range()函数,可以很方便的实现在指定范围内随机生成指定多个不重复数字。
# list_1 = random.sample(range(611), 300) # 612行
# list_2 = random.sample(range(608), 300) # 609列
# print(list_1, list_2)
data_train = np.zeros((8, 10000)) # 指数训练样本
spei_train = np.zeros((1, 10000)) # spei训练样本
data_test = np.zeros((8, 20000)) # 指数测试样本
spei_test = np.zeros((1, 20000)) # spei测试样本
flag = np.zeros_like(spei_array)
i = 0
while i < 30000: # (0,29999)
# 训练样本
if i < 10000: # (0,9999)
x = random.randint(0, 611) # 612行
y = random.randint(0, 608) # 609列
if flag[x][y] == 0: # 该坐标点没有取过标志0
spei_train[0][i] = spei_array[x][y]
for j in range(8): # (0,7)八个指数的矩阵
data_train[j][i] = data_array[j][x][y]
i += 1
flag[x][y] = 1 # 该坐标点有取过标志1
# 测试样本
elif i > 9999: # (10000,29999)
x = random.randint(0, 611) # 612行
y = random.randint(0, 608) # 609列
if flag[x][y] == 0: # 该坐标点没有取过标志0
spei_test[0][i - 10000] = spei_array[x][y]
for j in range(8): # (0,7)八个指数的矩阵
data_test[j][i - 10000] = data_array[j][x][y]
i += 1
flag[x][y] = 1 # 该坐标点有取过标志1
# print(spei_train)
# print(spei_test)
# print(data_train)
# print(data_test)
# 测试是否取了30000个坐标点:
# count = 0
# for i in flag:
# for j in i:
# if j == 1:
# count += 1
# print("取样点个数:" + str(count))
"""
1.np.save(‘a.npy’,a):save主要保存.npy文件
2.np.savez(‘a.npz’,ar0=a,ar1=b):savez主要保存.npz文件,但是它可以将多条数据同时压缩到一个.npz 文件中
同样地,虽然savez可以保存多条数据,但是也不可追加数据
3.np.savetxt(‘a.txt’,a):savetxt只要将数据保存为txt文件,和前两个不同,它可以再次对文件操作,
但是对已有数据的文件再次使用savetxt(),并不会将数据追加在后面,而是将之前数据覆盖。
4..npy文件追加数据:因为.npy 文件不能追加数据,所以如果有多条数据不同时的产生,而需要保存在同一个文件中,
则可以将多条数据先保存到一个数组中,然后再保存。
"""
out_path = 'H:\gee_image\\trian_test\data_train.npz'
# 保存样本数据
np.savez(f'{out_path}', ar0=flag, ar1=data_train, ar2=data_test, ar3=spei_train, ar4=spei_test) # 存入
# 读取保存的.npz样本文件
poem = np.load(out_path, allow_pickle=True)
print(poem.files)
flag = poem['ar0']
# 显示的值带省略号,要完全显示,执行:
# np.set_printoptions(threshold=np.inf)
# print(flag)
创建612*609的标志矩阵,避免取重复点,随机取样点置1:
训练样本:
测试样本:
查看取样点个数为30000并且不重复: