Python 使用numpy.reformate()添加标注
我正试图解决一个问题。我有一个数组中的气候模型数据,在这个模型的纬度和经度网格点上有480个月的条目(细节是不相关的)。也就是说,我有一个尺寸为(480,lat,lon)的numpy数组 我需要在每个空间网格点创建年平均值。我想这样做的方法是使用Python 使用numpy.reformate()添加标注,python,arrays,numpy,reshape,Python,Arrays,Numpy,Reshape,我正试图解决一个问题。我有一个数组中的气候模型数据,在这个模型的纬度和经度网格点上有480个月的条目(细节是不相关的)。也就是说,我有一个尺寸为(480,lat,lon)的numpy数组 我需要在每个空间网格点创建年平均值。我想这样做的方法是使用numpy.reforme()创建一个4D数组,其中包含维度(480/12,12,lat,lon)(在这里,我将时间步分组为12组,并按原样重新打包)。然后沿第二个轴取平均值(np.mean(dat\u new,axis=1)) 整个事情都会是 dat_
numpy.reforme()
创建一个4D数组,其中包含维度(480/12,12,lat,lon)(在这里,我将时间步分组为12组,并按原样重新打包)。然后沿第二个轴取平均值(np.mean(dat\u new,axis=1)
)
整个事情都会是
dat_new = np.reshape(dat, (dat.shape[0]/12, 12, dat.shape[1], dat.shape[2]))
dat_annual_mean = np.mean(dat_new, axis = 1)
我的问题是:重塑是这样工作的吗?它会按照正确的顺序重新安排事情吗?如果没有(或者即使是这样),是否还有其他(可能不那么笨拙的方法来实现这一点?)
谢谢。您应该首先排列尺寸,以便按照正确的顺序重塑数据
dat_new=np.reshape(np.transpose(dat,(1,2,0)),
(dat.shape[1],dat.shape[2],dat.shape[0]//12, 12))
dat_annual_mean = np.mean(dat_new, axis = 3)
i、 e.它将为您提供一个尺寸为(lat、lon、480/12)的数组,您可以在必要时进一步转置。简化后,我们可以看到整个数组,我认为您正在尝试这样做:
In [608]: arr = np.zeros((3*4,2),int)
In [609]: arr[:,0]=np.arange(12)
In [610]: arr
Out[610]:
array([[ 0, 0],
[ 1, 0],
[ 2, 0],
[ 3, 0],
[ 4, 0],
[ 5, 0],
[ 6, 0],
[ 7, 0],
[ 8, 0],
[ 9, 0],
[10, 0],
[11, 0]])
In [611]: arr.reshape(3,4,2)
Out[611]:
array([[[ 0, 0],
[ 1, 0],
[ 2, 0],
[ 3, 0]],
[[ 4, 0],
[ 5, 0],
[ 6, 0],
[ 7, 0]],
[[ 8, 0],
[ 9, 0],
[10, 0],
[11, 0]]])
In [612]: _.mean(axis=1)
Out[612]:
array([[ 1.5, 0. ],
[ 5.5, 0. ],
[ 9.5, 0. ]])
看起来不错,除了我会使用:
dat.shape[0]//12
或简单的-1
让它决定剩余的长度。用一个小数组进行实验,你可以看到值的布局,例如arr=np.arange(6*2)。重塑(6,2,1)
。重塑(3,2,2,1)
看起来正确吗?@hpaulj不,不正确,但诚实地说,如果不建议替代方案,它就不起作用,这对我真的没有帮助。我们正在试图弄清楚你想要什么样的安排。如果重塑不起作用,则可能需要转置/交换轴。但是没有一个具体的例子,我们只是猜测。如果我理解正确,你有一个形状数组(480,3),即480个数据点测量值和相关的纬度和经度。或者你有一个完美的纵横组合网格吗?numpy.reforme()的哪些特性让你知道这是可行的?我看不出换位有什么帮助。重塑的默认假设是类似C的索引顺序,因此最后一个索引变化最快。我假设你的480个样本是这样分布的,(lat,lon,0…39)对应于一月,(lat,lon,40…79)到二月,等等。如果你有疑问,也许准备一个测试数组,在那里你知道结果。我刚刚看了重塑的文档,如果你添加order='F'作为重塑的选项,你的原始代码也应该可以工作,这给了你Fortran顺序,第一个索引变化最快的地方。对不起,我以前没有看到你上面的最新帖子。既然我更好地理解了您的数据,我想(新的)上层代码是正确的。无论如何,我建议您理解/阅读多维数组是如何排序的,这只是为了确定。