Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不使用嵌套循环的3D数组中的Python时间序列计算?_Python_Arrays_Numpy_Statistics_Coding Efficiency - Fatal编程技术网

不使用嵌套循环的3D数组中的Python时间序列计算?

不使用嵌套循环的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

我有一个大的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)
“同时”和“采用轴”参数指定应沿哪个轴计算这些值,因此,如果将
轴=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函数都应该具有相同的功能(如果不确定,请查看上的文档)。此外,请随意接受此答案(如果您觉得它很好地回答了您的问题),将问题标记为已回答。