Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

More @d macro documentation #801

Merged
merged 2 commits into from
Sep 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/src/.vitepress/config.mts
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ export default defineConfig({
{ text: 'DimArrays', link: '/dimarrays' },
{ text: 'DimStacks', link: '/stacks' },
{ text: 'GroupBy', link: '/groupby' },
{ text: 'Dimension-aware broadcast', link: '/broadcast_dims.md' },
{ text: 'Dimension-aware broadcast', link: '/broadcasts.md' },
{ text: 'Getting information', link: '/get_info' },
{ text: 'Object modification', link: '/object_modification' },
]},
Expand Down
54 changes: 0 additions & 54 deletions docs/src/broadcast_dims.md

This file was deleted.

83 changes: 83 additions & 0 deletions docs/src/broadcasts.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# Dimensional broadcasts with `@d` and `broadcast_dims`

Broadcasting over AbstractDimArray works as usual with Base Julia broadcasts,
except that dimensions are checked for compatibility with eachother, and that
values match. Strict checks can be turned of globally with
`strict_broadcast!(false)`.
To avoid even dimension name checks, broadcast over `parent(dimarray)`.

The [`@d`](@ref) macro is a dimension-aware extension to regular dot brodcasting.
[`broadcast_dims`](@ref) and [`broadcast_dims`](@ref) are analagous to Base
julia `broadcast`.

Because we know the names of the dimensions, there is no ambiguity in which one
we mean to broadcast together. This means we can permute and reshape dims so
that broadcasts that would fail with a regular `Array` just work with a
`DimArray`.

As an added bonus, `broadcast_dims` even works on `DimStack`s. Currently `@d`
does not work on `DimStack`.

## Example: scaling along the time dimension

Define some dimensions:

````@example bd
using DimensionalData
using Dates
using Statistics
````

````@ansi bd
x, y, t = X(1:100), Y(1:25), Ti(DateTime(2000):Month(1):DateTime(2000, 12))
````

A DimArray from 1:12 to scale with:

````@ansi bd
month_scalars = DimArray(month, t)
````

And a larger DimArray for example data:

````@ansi bd
data = rand(x, y, t)
````

A regular broadcast fails:

````@ansi bd
scaled = data .* month_scalars
````

But `@d` knows to broadcast over the `Ti` dimension:

````@ansi bd
scaled = @d data .* month_scalars
````

We can see the means of each month are scaled by the broadcast :

````@ansi bd
mean(eachslice(data; dims=(X, Y)))
mean(eachslice(scaled; dims=(X, Y)))
````

You can also use `broadcast_dims` the same way:

````@ansi bd
broadcast_dims(*, data, month_scalars)
````

And with the [`@d`](@ref) macro you can set the dimension order and other
properties of the output array, by passing a single assignment or a `NamedTuple`
argument to `@d` after the broadcast:

````@ansi bd
@d data .* month_scalars dims=(Ti, X, Y)
````

Or
````@ansi bd
@d data .* month_scalars (dims=(Ti, X, Y), name=:scaled)
````
Loading