|
) r; i, A. E8 V- i) r2 S 气象海洋领域,常常会涉及到大规模的数据处理,比如高时空分辨率的模式数据、雷达数据和卫星数据等。 6 ~) s9 t/ j( ]5 `1 H
3 H D' X5 w% D: x7 H- w 大部分情况,我们一般只会涉及小规模数据处理,对计算效率并不会太过追求。但是当数据量变大时,低效的数据处理所耗费的时间非常明显,因此高效的数据处理方式尤为重要。
" x7 @( B$ p4 i# }5 N
% [- N1 N, L, @& S. U& a8 L I+ w8 G 本篇以拟合一个高维数据的正太分布参数为例,介绍如何使用xarray+dask加速数据处理。
4 O9 v6 w( H, b' m
) k* b- Y' {8 Z) g) H2 u0 E 数据维度X[time, lev, lat, lon],需要对三维空间每一点,沿着时间维度做正太分布拟合(正太分布拟合只是作为例子,这里可以定义你需要的操作函数)。
0 n$ c/ X* r y, k4 j; o0 g" F& b 其中几个关键点解释一下: & P2 R0 e& ]. t0 e2 ?
(1)首先定义拟合正太分布的函数
% j/ B8 y6 a$ e p1 Y+ I/ B def norm_fit(data):+ [" m' G" g. \
loc, scale = st.norm.fit(data)
- ]; i8 V9 H3 e2 K9 I8 Z8 u return np.array([loc, scale]) $ `) D$ u* _2 p h0 E* _
这里需要注意的是,拟合的函数,输出参数,需要打包为一个数组。并且它的维度需要和后面aplly_ufun定义的输出维度一致。 3 z6 i" m! M( ]) n# D" U: j" `8 V
(2)xarray分块
' O& Y" N% a' t% \ x = xr.DataArray(rs.randn(500, 20, 1500, 1500), dims=["time", "lev", "lat","lon"])
b3 _6 L$ {- Y" Z: q% s x = x.chunk({"lev":5, "lat":100,"lon":100})
4 O( h4 d4 {! t5 @; E, b+ B/ T5 l xarray结合dask可以将一个大型数组分成一个个数据块(chunk),需要注意的是我们需要沿着时间维操作,拟合需要整个时间维度的数据,因此时间维time不能分块,只能对其他维度分块。
6 O0 I* y2 f: X! y (3)xarray.apply_ufunc函数
: y8 u( ]- a, O result = xr.apply_ufunc(norm_fit,5 {" w0 Z) i# L+ h3 j* F2 X( t
x,
/ s/ x1 Q5 b' p+ k" k input_core_dims=[["time"]],
7 n5 s* C5 J) ?% b5 [ output_core_dims=[["paras"]],3 w6 e' P, }+ @- S; `- ?
dask="parallelized",& S, t3 I7 ~! ?1 g7 }9 ~, y3 O6 r
output_dtypes=[np.float],/ e$ ^* A5 I+ Z# @
dask_gufunc_kwargs={output_sizes:{"paras":2}}
% W, r+ A& K" J )
" b* |' @' W: u& q* P apply_ufunc函数具体可以参考官网教程,这里只说使用时遇到的困难,即如何定义输出维度:输出维度是用output_core_dim定义的,将输出的拟合参数(期望和标准差)定义为paras维度,维度的大小为2,通过output_sizes参数设置。这样我们输入[time, lev, lat, lon]的数据,在每个空间点对时间维度拟合之后,输出的数据为[lev, lat, lon, paras]。(PS: 这里感谢深雨露大佬的指点)
3 Q% ?9 a/ l9 w/ \1 J' V8 `* l4 [. O# z) L# `1 {1 ?
以下是全部代码: 6 ^6 ~' \& H, j+ ]. n- U
from scipy import stats as st
# b# Y) E3 C) K4 Y0 h( |/ e- U* J3 v
import xarray as xr
) d2 L7 n' X1 {4 p) h3 p import dask& H9 i4 T2 C8 g; \5 L8 _
import numpy as np
1 t+ Y0 ?* z2 R from dask.diagnostics import ProgressBar! e% {! { ^0 I R0 P+ @; u8 y
( r5 s2 d3 `7 {9 T6 A1 t. g4 c
def norm_fit(data):' K6 S3 C" W+ r2 t, D- d) G4 U
loc, scale = st.norm.fit(data)
4 ^9 T6 o3 C& F( g& J7 m' @ return np.array([loc, scale])
6 K) @7 t3 G7 B, s( Z* x& D
! x4 X* Q# l+ L rs = np.random.RandomState(0), \- G& Z# s- l* t* x/ Q+ U" y
x = xr.DataArray(rs.randn(500, 20, 1500, 1500), dims=["time", "lev", "lat","lon"])* X4 N' E; `& ~7 c
x = x.chunk({"lev":5, "lat":100,"lon":100})
' q$ R( Z3 C% `3 R% T/ [; {) Y! O# J1 h x+ U6 R- e# t
#使用apply_ufunc计算,并用dask的并行计算" L4 r; V( C4 o$ }* s; N$ N7 f
result = xr.apply_ufunc(norm_fit,- w4 a8 m: |# {8 q- { H
x,
6 ~4 ~# P0 L/ u+ g, J' ]4 Y input_core_dims=[["time"]],
8 z( T6 `1 o# a* i output_core_dims=[["paras"]], Q$ @8 E6 Q- Z1 V( ^
dask="parallelized",
& T% Z3 M- [; h& d, V, I output_dtypes=[np.float],6 P5 @7 z6 }4 d* I! E. p! I- k/ B
dask_gufunc_kwargs={output_sizes:{"paras":2}}' u% o( x- q6 r& Q
)
& W) V' S- R0 w5 f4 P) j. I- G+ X& y' k) Z
#compute进行真实的计算并显示进度: f1 n( r" k4 o! t/ d! @
with ProgressBar():" W4 C6 ^; w; U, ?/ P: C, [
result = results.compute()
* A9 y7 O$ U. l6 C1 |) ^8 f& @' Y# k3 y7 N( g8 @! U# Z
#结果冲命名保存到nc文件' [% U; ~5 v4 I9 E& s& S1 v
result = result.rename("norm_paras")+ W: W: N6 X, N( i& g0 l" L
result = result.to_netcdf("norm_fit_paras.nc",compute=False)4 R4 i( X/ M" u; x
with ProgressBar():, @/ N7 `" v7 E* I5 |
result.compute() , t, X: ^! U' |- l4 ?% |+ t8 r. m
转自:气海同途
8 w9 M8 y9 ]6 M2 G' G 关注【Ai尚研修科研技术平台】公众号,查看更多课程安排及免费数据资料 q& ], s2 p- N6 \
" a N& I3 |- j4 b; C- Q 推荐: 1 a0 x6 @6 ~( f9 }7 i
1、Python语言在地球科学领域中的应用实践技术应用
2 O$ X# t3 Z' e5 o: b 2、【夏令营】针对课题组人员AI培养计划:“开启AI科研之路” 3 p+ Q- o+ o" h! t8 V% ~2 Q
3、Python在气象与海洋中的实践技术应用精品课程 & g# x$ L j& ?3 l7 t1 O+ E, I; q
4、Python在WRF模型自动化运行及前后处理中的实践技术应用
1 I7 f" | [' G4 B! z5 d 5、全套Python机器学习核心技术与案例分析实践应用视频 5 T. y: w% N+ d4 Z) M
6、全套区域高精度地学模拟-WRF气象建模、多案例应用与精美制图精品课程 2 ]0 }. W0 d" y* o+ |! _
7、WRF DA资料同化系统理论、运行与与变分、混合同化新方法技术应用视频教程
; P4 X/ V- l' `4 z2 I1 i+ r
! J7 {, t8 v2 S" c; S# {8 v% t+ I p$ I
+ e+ K8 i3 I9 |0 @! V( Z( i) U
! Y3 y9 v1 B* i" P: G |