回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>假设我们有TRMM降水量数据,每个文件代表每个月的数据。例如,文件夹中的文件包括:</p>
<pre><code> 3B42.1998.01.01.7A.nc,
3B42.1998.02.01.7A.nc,
3B42.1998.03.01.7A.nc,
3B42.1998.04.01.7A.nc,
3B42.1998.05.01.7A.nc,
......
......
3B42.2010.11.01.7A.nc,
3B42.2010.12.01.7A.nc.
</code></pre>
<p>这些文件的维度如下:Xsize=1440,Ysize=400,Zsize=1,Tsize=1。经度设置为0到360,纬度设置为-50到50。
我想计算某个区域的降水量,比如在<code>lon=98.5, lon=100 and lat=4, lat=6.5</code>之间。这意味着,要只读取此区域中的变量-:</p>
<p><code>--------------------
|lon:98.5 lat:6.5|
| |
|lat:4 lon:100 |
---------------------</code></p>
<p>我曾经在GrADS(网格分析和显示系统)中做过这项工作。在GrADS中,可以这样做:(简化版)</p>
^{pr2}$
<p>我试着用Python做同样的事情,但是出了问题。
经过几点建议,我现在是:</p>
<pre><code> import csv
import netCDF4 as nc
import numpy as np
#calculating december only
f = nc.MF<a href="https://www.cnpython.com/pypi/dataset" class="inner-link">dataset</a>('d:/data/trmm/3B43.????.12.01.7A.nc')#maybe I shouldn't do MFDataset?
pcpt = f.variables['pcp']
lon = f.variables['longitude']
lat = f.variables['latitude']
# Determine which longitudes
latidx1 = (lat >=4.0 ) & (lat <=6.5 )
lonidx1 = (lon >=98.5 ) & (lon <=100.0 )
rainf1 = pcpt[:]
rainf1 = rainf1[:, latidx1][..., lonidx1]
rainf_1 = rainf1
with open('d:/trmmtest.csv', 'wb') as fp:
a = csv.writer(fp)
for i in rainf_1:
a.writerow([i])
</code></pre>
<p>这个脚本为CSV文件中的15个值生成一个列表。
但当我试图获得另一个区域的值,并对其进行必要的调整时,假设:</p>
<pre><code> latidx2 = (lat >=1.0 ) & (lat <=1.5 )
lonidx2 = (lon >=102.75 ) & (lon <=103.25 )
rainf2 = pcpt[:]
rainf2 = rainf2[:, latidx2][..., lonidx2]
rainf_2 = rainf2
</code></pre>
<p>我得到了和第一个相同的值。在</p>
<p><code>firstarea=[0.511935,1.0771,0.613548,1.48839,0.445161,1.39161,1.03548,0.452903, 3.07725,2.84613 0.701613,2.10581,2.47839,3.84097,2.41065,1.38387]</code></p>
<p><code>secondarea=[0.511935,1.0771,0.613548,1.48839,0.445161,1.39161,1.03548,0.452903, 3.07725,2.84613,0.701613,2.10581,2.47839,3.84097,2.41065,1.38387]</code></p>
<p>我在不同的脚本上做了测试,它仍然给了我相同的值。我检查了地图(之前构建的),这两个区域的值是不同的(12月的平均值)。在</p>
<p>知道为什么吗?还有其他优雅的写作方式吗?
谢谢。在</p>