在每个时间步(带)平均 3D numpy 数组中的所有 rows/columns

Average all rows/columns in 3D numpy array at each timestep (band)

我有一个 numpy.ma.core.MaskedArray 类型的 3D 数组。数据是 4x4 网格中每个 lat/lon 点的 10m 风向值。数据集是每小时的,所以我有 87672 个单独的矩阵(十年的数据)。

对于每个小时,我需要 4x4 矩阵的平均值以获得整个 lat/lon 网格框的平均风向。然后我想将这些值存储为数据框的一列。我可以使用 for 循环轻松完成此操作,但对我来说有点慢。

数据如下:

wdir10:
masked_array(
  data= [[[152.67026 , 146.70743 , 152.55719 , 164.92401 ],
         [130.54579 , 130.6751  , 146.74638 , 159.93202 ],
         [116.40863 , 119.380585, 133.9567  , 153.77013 ],
         [110.93645 , 118.25403 , 128.3094  , 146.62206 ]],

        [[134.27574 , 135.58499 , 149.5903  , 159.4063  ],
         [115.946495, 119.14671 , 134.47972 , 147.49466 ],
         [109.198265, 113.795906, 126.024475, 144.82605 ],
         [108.69715 , 117.25688 , 125.6559  , 141.5147  ]],

        [[119.89018 , 130.3573  , 150.05553 , 168.43152 ],
         [115.14506 , 120.63544 , 134.53693 , 150.49675 ],
         [117.6862  , 122.55777 , 132.94057 , 150.32137 ],
         [121.804016, 127.57132 , 136.711   , 152.43686 ]],

        ...,

我能做到:

dtime = pd.date_range(start='2012-01-01 00:00:00', end='2021-12-31 23:00:00', freq='H')
wind_df = pd.DataFrame(dtime)
wind_df['wdir.10'] = np.nan
for i in range(0,len(dtime)):
    wind_df['wdir.10'][i] = np.mean(wdir10[i,:,:])

效果很好,只是比我想要的要长一点(在我的 spyder 环境中大约 20 秒)。因为我要对其他几个变量(50m 和 100m 的风向,加上 10m、50m 和 100m 的风速)执行此操作,所以我希望它更快。有没有办法矢量化这个过程?或者我可以使用 groupby 吗?

提前致谢。

我没有测试性能,但你应该使用内置的 mean 方法并指定 axis 参数作为元组以根据需要沿多个轴减少:

np.mean(wdir10, axis = (1, 2))

请注意,根据 numpy documentation,这也等价于:

wdir10.mean(axis = (1, 2))