【问题标题】:Adding dimensions using numpy.reshape()使用 numpy.reshape() 添加尺寸
【发布时间】:2017-07-05 17:37:35
【问题描述】:

我有一种情况正在尝试解决。我在一个数组中有气候模型数据,在这个模型的纬度和经度网格点上有 480 个每月条目(细节无关紧要)。也就是说,我有一个尺寸为 (480, lat, lon) 的 numpy 数组。

我需要在每个空间网格点创建年度平均值。我希望喜欢这样做的方法是使用numpy.reshape() 创建一个尺寸为 (480/12, 12, lat, lon) 的 4D 数组(我将时间步分为 12 组和重新堆叠它们,就像它一样)。然后我将沿第二个轴平均 (np.mean(dat_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.shape[0]//12 或只是 -1 让它决定剩余的长度。
  • 用一个小数组进行实验,您可以在其中看到值的布局,例如arr = np.arange(6*2).reshape(6,2,1)reshape(3,2,2,1) 看起来对吗?
  • @hpaulj 不,它没有,但老实说,只是指出它不起作用而不建议替代方案并没有真正帮助我
  • 我们正在尝试找出您想要什么样的安排。如果重塑不起作用,您可能需要转置/交换轴。但是没有具体的例子,我们只是猜测。
  • 如果我理解正确,您有一个形状数组 (480, 3),即一个数据点的 480 个测量值以及相关的纬度和经度。或者你有一个完美的纬度/经度组合网格吗?

标签: python arrays numpy reshape


【解决方案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)

即它将为您提供一个具有维度 (lat, lon, 480/12) 的数组,如果需要,您可以进一步转置。

【讨论】:

  • numpy.reshape() 的哪些属性让您知道这会起作用?我看不出换位有什么帮助。
  • reshape 的默认假设是类 C 的索引顺序,因此最后一个索引变化最快。我假设你的 480 个样本分布使得 (lat,lon,0...39) 对应于一月,(lat,lon,40..79) 到二月等。如果你有疑问,也许准备一个测试数组,你知道结果的地方。
  • 我刚刚查看了 reshape 的文档,如果您添加 order='F' 作为 reshape 的选项,您的原始代码也应该可以工作,这为您提供 Fortran 顺序,其中第一个索引变化最快.
  • 对不起,我之前没有看到你的最新帖子。现在我更好地理解了你的数据,我猜(新的)上层代码是正确的。无论如何,我建议您了解/阅读多维数组的排序方式,以确保这一点。
【解决方案2】:

简化后我们可以看到整个数组,这就是我认为您正在尝试做的事情:

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. ]])

【讨论】:

    猜你喜欢
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多