【发布时间】:2020-07-06 09:59:50
【问题描述】:
我将 xarray 与我有测量和错误的数据一起使用。 我用坐标value和variance将它们存储在数据集中的一个维度moment上。 例如,当我计算一个维度的平均值时,我需要对值和方差进行不同的处理,因为前者应该组合为
mean_values = sum(values)/len(values)
但后者为
mean_variance = sum(variances**2)/len(variances).
目前我正在通过形成两个新数据集并将它们连接起来来做到这一点。这是非常丑陋的,令人费解的,不适合更复杂的计算。我希望能够一步完成这种操作,也许是通过定义一个将值和方差作为输入的函数,然后将数据集维度矩广播到它上面。
给定一个数据集 q_lp,其维度为 时刻、时间、位置:
q_lp_av = q_lp.sel(moment='value').mean(dim='time')
q_lp_var = q_lp.sel(moment='variance').reduce(average_of_squares, dim='time')
q_lp = xr.concat([q_lp_common_av, q_lp_common_var], dim='moment')
其中 average_of_squares 由
定义def average_of_squares(data, axis=None):
sums = np.sum(data**2, axis=axis)
if axis:
return sums/np.shape(data)[axis]**2
return sums/len(data)**2
- 有什么更好的方法来处理这个问题?
- 是否可以使用 xr.apply_ufunc 和 my_average 函数一步到位地执行此操作?
- 我不应该将这些论文放在一个数据集中吗? q_lp 稍后会与其他量(也与维度 moment、pos 和 time)组合成一个 DataSet。
感谢您的讨论、想法、提示和示例链接。
编辑: 澄清一下,我不喜欢拆分 DataArray,分别处理每个时刻并再次连接它们。我希望有可能执行以下操作(用于说明的未经测试的伪代码):
def multi_moment_average(mean, variance):
mean = np.average(mean)
variance = np.sum(variance**2)/len(variance)
return mean, variance
q_lp.reduce(multi_moment_average, broadcast='moment', dim='time')
最小的工作示例:
import numpy as np
import xarray as xr
def average_of_squares(data, axis=None):
sums = np.sum(data**2, axis=axis)
if axis:
return sums/np.shape(data)[axis]**2
return sums/len(data)**2
times = np.arange(10)
positions = np.array([1, 3, 5])
values = np.ones((len(times), len(positions))) * (2 + np.random.rand())
variance = np.ones((len(times), len(positions))) * np.random.rand()
q_lp = xr.DataArray(np.array([values, variance]),
coords=[['value', 'variance'], times, positions],
dims=['moment', 'time', 'position'])
q_lp_av = q_lp.sel(moment='value').mean(dim='time')
q_lp_var = q_lp.sel(moment='variance').reduce(average_of_squares, dim='time')
q_lp = xr.concat([q_lp_av, q_lp_var], dim='moment')
【问题讨论】:
标签: python python-xarray