创建 numpy 数组,其中值在其他两个相同大小的排列范围内
Creating numpy array where values are within the range of two other arranges of the same size
我创建了一个特定气候变量的地图,该地图是通过从 netCDF4 文件中提取数据并将其转换为掩码数组生成的。数据为9个CMIP6模型的整体均值。
我想在这个顶部绘制一些阴影线,显示所有模型都在均值的 1 个标准差以内的区域,以显示模型输出中变化最小的区域。
所有数组的形状都是(33, 180, 360),其中33是数组代表的年数,180是纬度坐标,360是经度坐标。然后我得到了时间的平均值,因此可以在地图上进行二维投影。到目前为止使用的代码如下:
from netCDF4 import Dataset
import matplotlib
matplotlib.use('agg')
import matplotlib.pyplot as plt
import numpy as np
import os
os.environ["PROJ_LIB"] = "C:/Users/username/miniconda3/Library/share;" #fixr
from mpl_toolkits.basemap import Basemap
from pylab import *
import matplotlib as mpl
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
#wind
#historicala
fig_index=1
fig = plt.figure(num=fig_index, figsize=(12,7), facecolor='w')
fbot_levels = arange(-0.3, 0.5,0.05)
fname_hist_tauu='C:/Users/userbame/Historical data analysis/Historical/Wind/tauu_hist_ensmean_so.nc'
ncfile_tauu_hist = Dataset(fname_hist_tauu, 'r', format='NETCDF4')
TS2_hist=ncfile_tauu_hist.variables['tauu'][:]
TS2_mean_hist = np.mean(TS2_hist, axis=(0))
LON=ncfile_tauu_hist.variables['LON'][:]
LAT=ncfile_tauu_hist.variables['LAT'][:]
ncfile_tauu_hist.close()
lon,lat=np.meshgrid(LON,LAT)
ax1 = plt.axes([0.1, 0.225, 0.5, 0.6])
meridians=[0,1,1,1]
m = Basemap(projection='spstere',lon_0=0,boundinglat=-35)
m.drawcoastlines()
x, y =m(lon,lat)
m.contourf(x,y,TS2_mean_hist , fbot_levels, origin='lower', cmap=cm.RdYlGn)
m.drawparallels(np.arange(-90.,120.,10.),labels=[1,0,0,0]) # draw parallels
m.drawmeridians(np.arange(0.,420.,30.),labels=meridians) # draw meridians
coloraxis = [0.1, 0.1, 0.5, 0.035]
cx = fig.add_axes(coloraxis, label='m', title='Wind Stress/ Pa')
cbar=plt.colorbar(cax=cx,orientation='horizontal',ticks=list(fbot_levels))
plt.savefig('C:/Users/username/Historical data analysis/Historical/Wind/Wind_hist_AP.png')
我需要一些帮助的是如何提取纬度和经度坐标的值,其中所有模型 numpy 数组都在整体平均值的一个标准差范围内,因为我不确定从哪里开始因为我对 python 还是很陌生。这是我到目前为止想出的,让你了解我的意思:
sd_minus_1 = ensemble_mean - stan_dev
sd_plus_1 = ensemble_mean + stan_dev
for mod in model_list:
new_arr = a = numpy.zeros(shape=(180,360))
if sd_minus_1 <= mod <= sd_plus_1:
np.append(neww_arr, mod, axis=None)
然后我想绘制它来创建一个看起来像这样的地图:
如有任何想法,我们将不胜感激!
如果您需要更多信息,请告诉我。
我将向您推荐一个与您所问的不同的示例,但我希望该示例、我的解释和您的理解足以解决您的问题。
首先,让我们创建数据并绘制它。
In [78]: import numpy as np
...: import matplotlib.pyplot as plt
...:
...: x = y = np.linspace(-3, 3, 21)
...: X, Y = np.meshgrid(x, y)
...: Z = X-Y+3*np.cos(X+Y)
...: plt.contourf(X, Y, Z) ; plt.colorbar()
Out[78]: <matplotlib.colorbar.Colorbar at 0x7fd8378a0400>
现在,类似于你想对标准偏差做的事情但不同的是(我没有你的数据),我们决定要标记所有具有值 -2<Z<+2
的点,我们可以找到所有满足第一个条件、第二个条件的点,最后取乘积
In [79]: greater, lesser = Z > -2, Z < +2
...: inside = greater*lesser
上面的工作原理是因为,例如,greater
是一个二维数组,其形状为 Z
,其中 1
满足条件,0
否则, lesser
相同,所以他们的乘积 inside
具有 Z
的形状(以及 X
和 Y
顺便说一句)和 1
两个条件满意,0
否则。
现在我们要创建一个掩码,为我们提供满足条件的点的 x 和 y 坐标,以及在这里,我们求助于数组的 .nonzero()
方法,即 returns,对于每个轴,我们具有非零值(即满足条件的位置)的索引列表。
In [80]: mask = inside.nonzero()
最后,我们可以使用 Numpy 的 扩展索引 来获得 x 和 y 位置在哪里放置标记
In [81]: plt.scatter(X[mask], Y[mask], color='w', ec='k')
Out[81]: <matplotlib.collections.PathCollection at 0x7fd837bdb160>
我创建了一个特定气候变量的地图,该地图是通过从 netCDF4 文件中提取数据并将其转换为掩码数组生成的。数据为9个CMIP6模型的整体均值。
我想在这个顶部绘制一些阴影线,显示所有模型都在均值的 1 个标准差以内的区域,以显示模型输出中变化最小的区域。
所有数组的形状都是(33, 180, 360),其中33是数组代表的年数,180是纬度坐标,360是经度坐标。然后我得到了时间的平均值,因此可以在地图上进行二维投影。到目前为止使用的代码如下:
from netCDF4 import Dataset
import matplotlib
matplotlib.use('agg')
import matplotlib.pyplot as plt
import numpy as np
import os
os.environ["PROJ_LIB"] = "C:/Users/username/miniconda3/Library/share;" #fixr
from mpl_toolkits.basemap import Basemap
from pylab import *
import matplotlib as mpl
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
#wind
#historicala
fig_index=1
fig = plt.figure(num=fig_index, figsize=(12,7), facecolor='w')
fbot_levels = arange(-0.3, 0.5,0.05)
fname_hist_tauu='C:/Users/userbame/Historical data analysis/Historical/Wind/tauu_hist_ensmean_so.nc'
ncfile_tauu_hist = Dataset(fname_hist_tauu, 'r', format='NETCDF4')
TS2_hist=ncfile_tauu_hist.variables['tauu'][:]
TS2_mean_hist = np.mean(TS2_hist, axis=(0))
LON=ncfile_tauu_hist.variables['LON'][:]
LAT=ncfile_tauu_hist.variables['LAT'][:]
ncfile_tauu_hist.close()
lon,lat=np.meshgrid(LON,LAT)
ax1 = plt.axes([0.1, 0.225, 0.5, 0.6])
meridians=[0,1,1,1]
m = Basemap(projection='spstere',lon_0=0,boundinglat=-35)
m.drawcoastlines()
x, y =m(lon,lat)
m.contourf(x,y,TS2_mean_hist , fbot_levels, origin='lower', cmap=cm.RdYlGn)
m.drawparallels(np.arange(-90.,120.,10.),labels=[1,0,0,0]) # draw parallels
m.drawmeridians(np.arange(0.,420.,30.),labels=meridians) # draw meridians
coloraxis = [0.1, 0.1, 0.5, 0.035]
cx = fig.add_axes(coloraxis, label='m', title='Wind Stress/ Pa')
cbar=plt.colorbar(cax=cx,orientation='horizontal',ticks=list(fbot_levels))
plt.savefig('C:/Users/username/Historical data analysis/Historical/Wind/Wind_hist_AP.png')
我需要一些帮助的是如何提取纬度和经度坐标的值,其中所有模型 numpy 数组都在整体平均值的一个标准差范围内,因为我不确定从哪里开始因为我对 python 还是很陌生。这是我到目前为止想出的,让你了解我的意思:
sd_minus_1 = ensemble_mean - stan_dev
sd_plus_1 = ensemble_mean + stan_dev
for mod in model_list:
new_arr = a = numpy.zeros(shape=(180,360))
if sd_minus_1 <= mod <= sd_plus_1:
np.append(neww_arr, mod, axis=None)
然后我想绘制它来创建一个看起来像这样的地图:
如有任何想法,我们将不胜感激!
如果您需要更多信息,请告诉我。
我将向您推荐一个与您所问的不同的示例,但我希望该示例、我的解释和您的理解足以解决您的问题。
首先,让我们创建数据并绘制它。
In [78]: import numpy as np
...: import matplotlib.pyplot as plt
...:
...: x = y = np.linspace(-3, 3, 21)
...: X, Y = np.meshgrid(x, y)
...: Z = X-Y+3*np.cos(X+Y)
...: plt.contourf(X, Y, Z) ; plt.colorbar()
Out[78]: <matplotlib.colorbar.Colorbar at 0x7fd8378a0400>
现在,类似于你想对标准偏差做的事情但不同的是(我没有你的数据),我们决定要标记所有具有值 -2<Z<+2
的点,我们可以找到所有满足第一个条件、第二个条件的点,最后取乘积
In [79]: greater, lesser = Z > -2, Z < +2
...: inside = greater*lesser
上面的工作原理是因为,例如,greater
是一个二维数组,其形状为 Z
,其中 1
满足条件,0
否则, lesser
相同,所以他们的乘积 inside
具有 Z
的形状(以及 X
和 Y
顺便说一句)和 1
两个条件满意,0
否则。
现在我们要创建一个掩码,为我们提供满足条件的点的 x 和 y 坐标,以及在这里,我们求助于数组的 .nonzero()
方法,即 returns,对于每个轴,我们具有非零值(即满足条件的位置)的索引列表。
In [80]: mask = inside.nonzero()
最后,我们可以使用 Numpy 的 扩展索引 来获得 x 和 y 位置在哪里放置标记
In [81]: plt.scatter(X[mask], Y[mask], color='w', ec='k')
Out[81]: <matplotlib.collections.PathCollection at 0x7fd837bdb160>