创建numpy数组,其中值在其他两个相同大小排列的范围内

Posted

技术标签:

【中文标题】创建numpy数组,其中值在其他两个相同大小排列的范围内【英文标题】:Creating numpy array where values are within the range of two other arranges of the same size 【发布时间】:2021-10-13 01:51:21 【问题描述】:

我创建了一张特定气候变量的地图,该地图是通过从 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)

然后我希望绘制它以创建一个看起来像这样的地图:

任何想法将不胜感激!

如果您需要更多信息,请告诉我。

【问题讨论】:

请参阅How to ask a good question。始终提供完整的 minimal reproducible example 代码、数据、错误、当前输出和预期输出,如 formatted text。如果相关,只有绘图图像是可以的。 这能回答你的问题吗? How do I select elements of an array given condition? numpy.select @TrentonMcKinney 是的,谢谢 太好了,很高兴这对你有用。 【参考方案1】:

我会给你一个与你所问的不同的例子,但我希望这个例子、我的解释和你的理解足以解决你的问题。

首先,让我们创建数据并绘制它。

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&lt;Z&lt;+2 的点,我们可以这样做找到所有满足第一个条件的点,第二个条件,最后取积

In [79]: greater, lesser = Z > -2, Z < +2
    ...: inside = greater*lesser

上面的工作是因为,例如,greater 是一个二维数组,其形状为Z1 满足条件,否则0lesser 相同,所以他们的产品,@ 987654333@,具有Z(和XY btw)和1 的形状,这两个条件都满足,否则0

现在我们要创建一个蒙版,它为我们提供满足条件的点的 xy 坐标,这里我们求助于.nonzero()数组方法,它为每个轴返回一个索引列表,其中我们有一个非零值(即满足条件)。

In [80]: mask = inside.nonzero()

最后,我们可以使用 Numpy 的 扩展索引 来设置 xy 放置标记的位置

In [81]: plt.scatter(X[mask], Y[mask], color='w', ec='k')
Out[81]: <matplotlib.collections.PathCollection at 0x7fd837bdb160>

【讨论】:

感谢您的回复,使用散点图确实为我提供了我所追求的情节。但是我现在的问题是颜色条仅绘制散点图的值,而不是绘制在下面的地图中的所有值。你知道如何解决这个问题吗? 其实不用担心我已经解决了。

以上是关于创建numpy数组,其中值在其他两个相同大小排列的范围内的主要内容,如果未能解决你的问题,请参考以下文章

numpy

如何对齐两个大小不等的时间序列numpy数组?

numpy数组和python数组的区别

numpy数组与矩阵运算

NumPy_1

NumPy 基础用法