import netCDF4 import geopandas as gpd import numpy as np import pandas as pd # 加载nc文件 nc_file = netCDF4.Dataset('E:/data/temp_CMFD_V0106_B-01_01mo_010deg_197901-201812.nc') temp_data = nc_file.variables['temp'][:] # 加载shp文件 shp_file = gpd.read_file('D:/dilidashuju/shijiquhua.shp') # 计算每个市级行政区的平均温度 years = range(1979, 2018) months = range(1, 13) temp_df = pd.DataFrame(columns=['year', 'month', 'city', 'temperature']) for year in years: for month in months: temp_array = temp_data[(year-1979)*12+month-1, :, :] for i, row in shp_file.iterrows(): city_name = row['市'] city_geom = row['geometry'] temp_mean = np.mean(temp_array[np.array([city_geom.contains(Point(lon, lat)) for lon, lat in zip(temp_array.lon, temp_array.lat)])]) temp_df = temp_df.append({'year': year, 'month': month, 'city': city_name, 'temperature': temp_mean}, ignore_index=True) # 将结果保存到CSV文件中 temp_df.to_csv('city_temperature.csv', index=False)这串代码报错Traceback (most recent call last): File "C:\Users\Lenovo\PycharmProjects\pythonditu\main.py", line 24, in <module> temp_mean = np.mean(temp_array[np.array([city_geom.contains(Point(lon, lat)) for lon, lat in zip(temp_array.lon, temp_array.lat)])]) AttributeError: 'MaskedArray' object has no attribute 'lon'怎么修改
时间: 2024-03-21 12:44:07 浏览: 220
这个错误是因为 `temp_array` 是一个 `MaskedArray` 对象,它不能像普通的 numpy 数组那样直接使用索引访问变量。要解决此错误,可以使用 `data` 属性来访问 `temp_array` 的实际数据数组,如下所示:
```
temp_mean = np.mean(temp_array.data[np.array([city_geom.contains(Point(lon, lat)) for lon, lat in zip(temp_array.lon, temp_array.lat)])])
```
这将使用列表推导式为 `temp_array` 中的每个点创建一个包含 True 或 False 的数组,并将其传递给 `temp_array.data`,以便获取在 `city_geom` 中的温度值。
相关问题
代码是# -*- coding: utf-8 -*- # import arcpy import netCDF4 as nc # 将nc文件选择变量后转成tif图层成功 nc_file = nc.Dataset('F:/nc_data/1979_sd.nc', 'r') # 获取变量 var2 = nc_file.variables['rsn'] var1 = nc_file.variables['sd'] # 将变量中的数据相加 new_var_data = 10*var1[:] / var2[:] # 创建新的.nc文件 new_nc_file = nc.Dataset('1979_sd_1.nc', 'w') # 定义.nc文件的维度 new_nc_file.createDimension('lat', var1.shape[0]) new_nc_file.createDimension('lon', var1.shape[1]) # 定义新的变量 new_var = new_nc_file.createVariable('new_variable', 'f4', ('lat', 'lon')) # 将新变量的数据写入新的.nc文件 new_var[:] = new_var_data # 关闭文件 nc_file.close() new_nc_file.close()
在你的代码中,`var1` 和 `var2` 可能是两个不同形状的数组。具体来说,`var1` 和 `var2` 可能有不同的维度,或者在某个维度上的长度不同,从而导致在计算 `new_var_data` 时出现了 shape mismatch 的错误。
你可以通过打印 `var1` 和 `var2` 的形状,以及它们在各个维度上的长度,来检查这个问题。具体代码如下:
```python
import netCDF4 as nc
nc_file = nc.Dataset('F:/nc_data/1979_sd.nc', 'r')
var1 = nc_file.variables['sd']
var2 = nc_file.variables['rsn']
print(var1.shape)
print(var2.shape)
print(var1.shape[0], var2.shape[0])
print(var1.shape[1], var2.shape[1])
```
运行这段代码后,将会输出 `var1` 和 `var2` 的形状以及它们在各个维度上的长度。你可以根据这些信息来判断 `var1` 和 `var2` 是否有不同的维度或者长度,从而找到并解决 shape mismatch 的问题。
import netCDF4 as nc import numpy as np from netCDF4 import Dataset import matplotlib.pyplot as plt from matplotlib.cm import get_cmap from matplotlib.colors import from_levels_and_colors import cartopy.crs as crs import cartopy.feature as cfeature from cartopy.feature import NaturalEarthFeature import cartopy.crs as ccrs import cartopy.feature as cfeature from wrf import (to_np, getvar, smooth2d, get_cartopy, cartopy_xlim, cartopy_ylim, latlon_coords) import warnings warnings.filterwarnings('ignore') file = 'D:/transfer/wrfout_d01_2016-03-01_00_00_00' ncfile = Dataset("D:/transfer/wrfout_d01_2016-03-01_00_00_00") dataset = nc.Dataset(file) latitude = dataset.variables['XLAT'][0][:] longitude = dataset.variables['XLONG'][0][:] co = dataset.variables['co'][1][1][:][:] co1 = getvar(ncfile, "co") cart_proj = get_cartopy(co1) plt.contourf(longitude,latitude, co, levels=38, cmap='hot',projection=cart_proj) plt.colorbar() # 创建一个投影 ax = plt.axes(projection=cart_proj) # 添加底图特征 ax.add_feature(cfeature.COASTLINE) ax.add_feature(cfeature.BORDERS) # 设置地图范围 ax.set_extent([90, 110, 0, 30],) plt.show()
以下是一个可能的代码优化方案:
1. 删除未使用的库和模块
在代码中,导入了一些未使用的库和模块,包括numpy、get_cmap、from_levels_and_colors等,可以将其删除以减少代码量。
2. 删除重复导入的库和模块
在代码中,导入了多个相同的库和模块,包括cartopy、cartopy.crs、cartopy.feature,可以将其合并为一个导入语句。
3. 优化变量的命名和赋值
在代码中,一些变量的命名不够直观,例如co、co1等,可以改为更具有描述性的名称。另外,一些变量的赋值方式可以简化为一行。
4. 简化图形绘制代码
在代码中,图形绘制的代码比较冗长,可以简化为一行或者几行,同时可以将一些公共的参数提取出来作为全局变量,以便后续的绘图。
综上所述,以下是一个可能的优化后的代码:
```
import netCDF4 as nc
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from netCDF4 import Dataset
from wrf import to_np, getvar, get_cartopy
warnings.filterwarnings('ignore')
file = 'D:/transfer/wrfout_d01_2016-03-01_00_00_00'
ncfile = Dataset(file)
latitude = ncfile.variables['XLAT'][0][:]
longitude = ncfile.variables['XLONG'][0][:]
co = ncfile.variables['co'][1][1][:][:]
cart_proj = get_cartopy(getvar(ncfile, "co"))
plt.contourf(longitude, latitude, co, levels=38, cmap='hot', projection=cart_proj)
plt.colorbar()
ax = plt.axes(projection=cart_proj)
ax.set_extent([90, 110, 0, 30])
ax.add_feature(cfeature.COASTLINE)
ax.add_feature(cfeature.BORDERS)
plt.show()
```
阅读全文