不使用嵌套循环的3D数组中的Python时间序列计算?
我有一个大的3D阵列,每个层都是来自同一时间的数据。我想计算每个网格单元的时间序列统计数据。下面的代码块是一个过于简化的版本 我古老的FORTRAN/C背景告诉我应该使用嵌套循环,但我忍不住认为必须有一种更“Pythonic”的方法来实现这一点(也许也要快得多?)。有什么帮助吗 谢谢不使用嵌套循环的3D数组中的Python时间序列计算?,python,arrays,numpy,statistics,coding-efficiency,Python,Arrays,Numpy,Statistics,Coding Efficiency,我有一个大的3D阵列,每个层都是来自同一时间的数据。我想计算每个网格单元的时间序列统计数据。下面的代码块是一个过于简化的版本 我古老的FORTRAN/C背景告诉我应该使用嵌套循环,但我忍不住认为必须有一种更“Pythonic”的方法来实现这一点(也许也要快得多?)。有什么帮助吗 谢谢 # Brute-force time-series stats import numpy as np rows = 2 cols = 4 dates = 3 time_series = np.empty([r
# 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)
“同时”和“采用轴”参数指定应沿哪个轴计算这些值,因此,如果将轴=2
传递给每个轴(2是第三个轴,即(0,1,2)),则不需要循环
samples = np.count_nonzero(~np.isnan(time_series), axis = 2)
means = np.nanmean(time_series, axis = 2)
将给出与双循环相同的结果
在我的jupyter笔记本上使用%%timeit
进行检查,并且使用numpy axis参数确实比循环快至少5倍(这取决于阵列的复杂性,但通过我的几次尝试,性能时间的提高会随着复杂性的增加而变得更好)
结果:
好极了!刚刚实现了这个更改,大大缩短了总体处理时间。谢谢。很高兴它工作得很好:)大多数(不是所有)numpy函数都应该具有相同的功能(如果不确定,请查看上的文档)。此外,请随意接受此答案(如果您觉得它很好地回答了您的问题),将问题标记为已回答。