15

I need to add a dimension to a DataArray, filling the values across the new dimension. Here's the original array.

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)])

I guess I could create an empty DataArray with the new dimension and copy the existing data in.

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

A better idea might be to be to use concat. It took me a while to figure out how to specify both the dims and the coords for the concat dimension, and none of these options seem great. Is there something I'm missing that can makes this version cleaner?

# 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']))

Still, is there a better way to do this than either of the two above options?

4 Answers 4

14

If DA is your data array with length DimLen, you can now use expand_dims:

DA.expand_dims({'NewDim':DimLen})
Sign up to request clarification or add additional context in comments.

Comments

4

Because of the way that math is applied over new dimensions I like to multiply in order to add new dimensions.

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

1 Comment

Quick solution although it leads to lose the available attributes in x
4

Using .assign_coords method will do it. However you can't assign coordinates to a non-existant dimension, the way to do as a one liner is:

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

1 Comment

When I did this I got "ValueError: dimension [name] already exists as a scalar variable", but if I swap the assign and expand, it works fine!
1

With reference to the syntax of the question:

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.