在每个时间步(带)平均 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))
我有一个 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))