Python 使用numpy.reformate()添加标注

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_

我正试图解决一个问题。我有一个数组中的气候模型数据,在这个模型的纬度和经度网格点上有480个月的条目(细节是不相关的)。也就是说,我有一个尺寸为(480,lat,lon)的numpy数组

我需要在每个空间网格点创建年平均值。我想这样做的方法是使用
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顺序,第一个索引变化最快的地方。对不起,我以前没有看到你上面的最新帖子。既然我更好地理解了您的数据,我想(新的)上层代码是正确的。无论如何,我建议您理解/阅读多维数组是如何排序的,这只是为了确定。