Я использую xarray с данными, для которых у меня есть измерения и ошибки. Я храню их по измерению момент в наборе данных с координатами значение и дисперсия . Когда я вычисляю, например, среднее значение по измерению, мне нужно, чтобы значения и дисперсии обрабатывались по-разному, поскольку первые должны быть объединены как
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')
, где medium_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_ufun c и my_average , чтобы сделать это за один шаг и на месте?
- Должен ли я вообще не собирать тезисы в один набор данных? Позже q_lp объединяется с другими величинами, также с моментом измерений, положением и временем, в DataSet.
Я благодарен за обсуждение, идеи, советы и ссылки на примеры.
Edit: чтобы уточнить, мне не нравится разбивать 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')