将维度添加到xarray DataArray

时间:2016-09-21 20:53:30

标签: python python-xarray

我需要向DataArray添加维度,填充新维度的值。这是原始数组。

a_size = 10
a_coords = np.linspace(0, 1, a_size)

b_size = 5
b_coords = np.linspace(0, 1, b_size)

# original 1-dimensional array
x = xr.DataArray(
    np.random.random(a_size),
    coords=[('a', a coords)])

我想我可以创建一个带有新维度的空DataArray并复制现有数据。

y = xr.DataArray(
    np.empty((b_size, a_size),
    coords=([('b', b_coords), ('a', a_coords)])
y[:] = x

更好的想法可能是使用concat。我花了一段时间才弄清楚如何为concat维度指定dims和coords,并且这些选项都不是很好。有什么我想念的东西可以使这个版本更清洁吗?

# specify the dimension name, then set the coordinates
y = xr.concat([x for _ in b_coords], 'b')
y['b'] = b_coords

# specify the coordinates, then rename the dimension
y = xr.concat([x for _ in b_coords], b_coords)
y.rename({'concat_dim': 'b'})

# use a DataArray as the concat dimension
y = xr.concat(
    [x for _ in b_coords],
    xr.DataArray(b_coords, name='b', dims=['b']))

但是,有没有比上述两个选项中的任何一个更好的方法呢?

5 个答案:

答案 0 :(得分:4)

由于数学应用于新尺寸的方式,我喜欢将其相乘以添加新尺寸。

identityb = xr.DataArray(np.ones_like(b_coords), coords=[('b', b_coords)])
y = x * identityb

答案 1 :(得分:3)

您已对当前选项进行了非常彻底的分析,实际上这些选项都不是很干净。

这对于为xarray编写来说肯定是有用的功能,但是还没有人能够实现它。也许你会有兴趣帮忙吗?

针对某些API提案,请参阅此GitHub问题:https://github.com/pydata/xarray/issues/170

答案 2 :(得分:1)

如果DA是长度为DimLen的数据数组,则现在可以使用:

DA.expand_dim({'NewDim':DimLen})

答案 3 :(得分:1)

使用.assign_coords方法即可。但是,您不能将坐标分配给不存在的尺寸,作为一个衬里的方法是:

y = x.expand_dims({b_coords.name: b_size}).assign_coords({b_coords.name: b_coords})

答案 4 :(得分:0)

参考问题的语法:

y = x.expand_dims({"b": b_coords})