Python 不使用嵌套循环的 3D 数组中的时间序列计算?
Python Time-Series Calculations in 3D Arrays without using Nested Loops?
我有一个很大的 3D 数组,其中每一层都是一次的数据。我想通过时间计算每个网格单元的时间序列统计数据。下面的代码块是一个大大简化的版本。
我古老的 FORTRAN/C 背景说我应该使用嵌套循环,但我不禁认为必须有一种更“Pythonic”的方式来做到这一点(也许也快得多?) .有帮助吗?
谢谢
# Brute-force time-series stats
import numpy as np
rows = 2
cols = 4
dates = 3
time_series = np.empty([rows, cols, dates])
samples = np.zeros([rows, cols])
means = np.zeros([rows, cols])
for r in range(rows):
for c in range(cols):
samples[r, c] = np.count_nonzero(~np.isnan(time_series[r, c, :]))
means[r, c] = np.nanmean(time_series[r, c, :])
print("Means at each grid cell:", means)
print("Samples:", samples)
两个 numpy.count_nonzero and numpy.nanmean 都接受轴参数来指定它应该沿着哪个轴计算这些值,所以如果你将 axis = 2
传递给每个(2 是第三轴,即(0,1, 2)), 你不需要循环。
samples = np.count_nonzero(~np.isnan(time_series), axis = 2)
means = np.nanmean(time_series, axis = 2)
将给出与双循环相同的结果。
在我的 jupyter notebook 上用 %%timeit
检查过,使用 numpy axis 参数确实比循环快至少 5 倍(这取决于你的数组的复杂性,但从我的几次尝试中获得随着复杂性的增加,性能时间会变得更好。
结果:
我有一个很大的 3D 数组,其中每一层都是一次的数据。我想通过时间计算每个网格单元的时间序列统计数据。下面的代码块是一个大大简化的版本。
我古老的 FORTRAN/C 背景说我应该使用嵌套循环,但我不禁认为必须有一种更“Pythonic”的方式来做到这一点(也许也快得多?) .有帮助吗?
谢谢
# Brute-force time-series stats
import numpy as np
rows = 2
cols = 4
dates = 3
time_series = np.empty([rows, cols, dates])
samples = np.zeros([rows, cols])
means = np.zeros([rows, cols])
for r in range(rows):
for c in range(cols):
samples[r, c] = np.count_nonzero(~np.isnan(time_series[r, c, :]))
means[r, c] = np.nanmean(time_series[r, c, :])
print("Means at each grid cell:", means)
print("Samples:", samples)
两个 numpy.count_nonzero and numpy.nanmean 都接受轴参数来指定它应该沿着哪个轴计算这些值,所以如果你将 axis = 2
传递给每个(2 是第三轴,即(0,1, 2)), 你不需要循环。
samples = np.count_nonzero(~np.isnan(time_series), axis = 2)
means = np.nanmean(time_series, axis = 2)
将给出与双循环相同的结果。
在我的 jupyter notebook 上用 %%timeit
检查过,使用 numpy axis 参数确实比循环快至少 5 倍(这取决于你的数组的复杂性,但从我的几次尝试中获得随着复杂性的增加,性能时间会变得更好。
结果: