我有一个1D样本阵列,每个样本都有相应的x和y坐标。我想将其转换为2D网格,其中每个网格单元包含落入该网格单元的所有样本的平均值。当然我可以手工编程,但我的印象是,这是可能的多维分组。
作为一个例子,我做了一个李萨如曲线
的数据
我将这些数据放入DataArray中,并使用x
和y
坐标创建MultiIndex。
my_data = <xarray.DataArray 'my_data' (time: 1200)>
array([0.000e+00, 1.000e+00, 2.000e+00, ..., 1.197e+03, 1.198e+03,
1.199e+03])
Coordinates:
h (time) float64 0.0 0.5 1.0 1.5 2.0 ... 598.0 598.5 599.0 599.5
* time (time) object MultiIndex
* x (time) float64 0.0 0.3596 0.6711 0.8929 ... 0.5044 0.7812 0.9535
* y (time) float64 1.0 0.9498 0.8041 0.5777 ... -0.6339 -0.36 -0.04993
字符串
完整的示例代码如下:
import matplotlib.pyplot as plt
import numpy as np
import xarray as xr
DIM_TIME = 'time'
t = np.arange(1200.0)
da = xr.DataArray(
name='my_data',
data = t, dims=[DIM_TIME],
coords = {
'x': (DIM_TIME, np.sin(t / np.e)),
'y': (DIM_TIME, np.cos(t / np.pi)),
'h': (DIM_TIME, t/2)})
da = da.set_xindex(['x', 'y']) # Add multi index
print(f"\n{da.name} = {da}")
bins = [-1.0, -0.6, -0.2, 0.2, 0.6, 1.0]
binned_x = da.groupby_bins("x", bins).mean().rename("bin_x_avg")
print(f"\n{binned_x.name} = {binned_x}")
da.to_dataset().plot.scatter(x='x', y='y', hue='h')
plt.show()
# Raises IndexError: too many indices
binned_xy = da.groupby_bins(("y", "x"), (bins, bins)).mean() # Something like this.
型
我可以按一维分组(binned_x
),它给出了一个有5个元素的1D数组。
bin_x_avg = <xarray.DataArray 'bin_x_avg' (x_bins: 5)>
array([603.20738636, 598.84431138, 600.03870968, 596.18823529,
597.48876404])
Coordinates:
* x_bins (x_bins) object (-1.0, -0.6] (-0.6, -0.2] ... (0.2, 0.6] (0.6, 1.0]
型
我想做一些类似的事情,在二维空间中。它应该返回一个5乘5的DataArray。类似于我的代码中的最后一条语句(binned_xy
)。
这在XArray中可能吗?
1条答案
按热度按时间vom3gejh1#
可以使用flox:
字符串
如果你想要数字坐标:
型