优化一下代码 import rasterio import numpy as np def calculate_VI(EI, SI, RI): EI = EI.astype(np.float64) SI = SI.astype(np.float64) RI = RI.astype(np.float64) EI = np.where(EI == -999, np.nan, EI) SI = np.where(SI == -999, np.nan, SI) RI = np.where(RI == -999, np.nan, RI) # 分步计算,并检查中间结果 numerator = EI * SI denominator = 1 + RI ratio = numerator / denominator # 检查比值是否存在负值 print('Ratio contains negative value:', np.any(ratio < 0)) VI = np.sqrt(ratio) return VI # 读取 EI、SI 和 RI 的 TIFF 文件 with rasterio.open('H:/AAAAASIDA/A_ORA/A_mingchengjieguo/Abeife/土地利用/tudiliy_2020_01/正确转化/脆弱性01/EI.tif') as src_ei, \ rasterio.open('H:/AAAAASIDA/A_ORA/A_mingchengjieguo/Abeife/土地利用/tudiliy_2020_01/正确转化/脆弱性01/SI.tif') as src_si, \ rasterio.open('H:/AAAAASIDA/A_ORA/A_mingchengjieguo/Abeife/土地利用/tudiliy_2020_01/正确转化/脆弱性01/RI.tif') as src_ri: # 获取空间地理信息 profile = src_ei.profile transform = src_ei.transform # 读取数据 ei_data = src_ei.read(1) si_data = src_si.read(1) ri_data = src_ri.read(1) # 根据公式计算 VI vi_data = calculate_VI(ei_data, si_data, ri_data) # 设置新的文件路径 output_path = 'H:/AAAAASIDA/A_ORA/A_mingchengjieguo/Abeife/土地利用/tudiliy_2020_01/正确转化/脆弱性01/VI01.tif' # 将结果写入新的 TIFF 文件 profile.update(dtype=rasterio.float32) # 更新数据类型为 float32 with rasterio.open(output_path, 'w', **profile) as dst: dst.write(vi_data.astype(rasterio.float32), 1) # 将结果写入新的 TIFF 文件
时间: 2024-02-12 12:04:01 浏览: 160
python 3.74 运行import numpy as np 报错lib\site-packages\numpy\__init__.py
可以考虑将代码进行优化,例如使用数组运算来替代循环:
```python
import rasterio
import numpy as np
def calculate_VI(EI, SI, RI):
EI = np.where(EI == -999, np.nan, EI).astype(np.float64)
SI = np.where(SI == -999, np.nan, SI).astype(np.float64)
RI = np.where(RI == -999, np.nan, RI).astype(np.float64)
numerator = EI * SI
denominator = 1 + RI
ratio = numerator / denominator
# 检查比值是否存在负值
print('Ratio contains negative value:', np.any(ratio < 0))
VI = np.sqrt(ratio)
return VI
# 读取 EI、SI 和 RI 的 TIFF 文件
with rasterio.open('H:/AAAAASIDA/A_ORA/A_mingchengjieguo/Abeife/土地利用/tudiliy_2020_01/正确转化/脆弱性01/EI.tif') as src_ei, \
rasterio.open('H:/AAAAASIDA/A_ORA/A_mingchengjieguo/Abeife/土地利用/tudiliy_2020_01/正确转化/脆弱性01/SI.tif') as src_si, \
rasterio.open('H:/AAAAASIDA/A_ORA/A_mingchengjieguo/Abeife/土地利用/tudiliy_2020_01/正确转化/脆弱性01/RI.tif') as src_ri:
# 获取空间地理信息
profile = src_ei.profile
transform = src_ei.transform
# 读取数据
ei_data = src_ei.read(1)
si_data = src_si.read(1)
ri_data = src_ri.read(1)
# 根据公式计算 VI
vi_data = calculate_VI(ei_data, si_data, ri_data)
# 设置新的文件路径
output_path = 'H:/AAAAASIDA/A_ORA/A_mingchengjieguo/Abeife/土地利用/tudiliy_2020_01/正确转化/脆弱性01/VI01.tif'
# 将结果写入新的 TIFF 文件
profile.update(dtype=rasterio.float32) # 更新数据类型为 float32
with rasterio.open(output_path, 'w', **profile) as dst:
dst.write(vi_data.astype(rasterio.float32), 1)
```
此外,如果要对多个文件进行处理,可以考虑将代码封装成一个函数,使用参数来传入文件路径和输出路径,以及其他可选参数。这样可以提高代码的重用性和可维护性。
阅读全文