diff --git a/previews/PR528/crash/generated/course/course/index.html b/previews/PR528/crash/generated/course/course/index.html index 2c3fe8426..03c8eef28 100644 --- a/previews/PR528/crash/generated/course/course/index.html +++ b/previews/PR528/crash/generated/course/course/index.html @@ -551,32 +551,32 @@
5×5 DimArray{Float64,2} with dimensions: X, Y
- 0.610652 0.58118 0.905337 0.837697 0.767474
- 0.104909 0.799412 0.484191 0.36956 0.164103
- 0.943738 0.181849 0.835808 0.00869301 0.504133
- 0.182849 0.641531 0.94619 0.750461 0.0331413
- 0.0402291 0.991976 0.00437949 0.458619 0.536827
+ 0.124874 0.566452 0.913496 0.503004 0.943575
+ 0.65846 0.145551 0.680193 0.767833 0.274717
+ 0.754621 0.972466 0.757034 0.549937 0.0993212
+ 0.856564 0.355987 0.283302 0.654112 0.311087
+ 0.903285 0.856681 0.129552 0.112247 0.551085
get value
A[Y(1), X(2)]
0.10490910803361231
+0.6584600731758927
As shown above, Dimension
s can be used to construct arrays in rand
, ones
, zeros
and fill
with either a range for a lookup index or a number for the dimension length.
Or we can use the Dim{X}
dims by using Symbol
s, and indexing with keywords:
A = DimArray(rand(5, 5), (:a, :b))
5×5 DimArray{Float64,2} with dimensions: Dim{:a}, Dim{:b}
- 0.313941 0.785278 0.57812 0.866912 0.0878701
- 0.361067 0.969103 0.567315 0.128225 0.802768
- 0.387414 0.642912 0.0187058 0.96045 0.115424
- 0.896839 0.9305 0.29628 0.916632 0.328504
- 0.126352 0.634827 0.627215 0.395971 0.76365
+ 0.699059 0.7846 0.668121 0.615491 0.777982
+ 0.670299 0.894482 0.712696 0.742939 0.239314
+ 0.499818 0.109764 0.0703531 0.495425 0.450842
+ 0.302298 0.662751 0.0455818 0.506814 0.335471
+ 0.370046 0.50841 0.350326 0.863748 0.295432
get value
A[a=3, b=5]
-0.11542371626636982
+0.4508424181357401
Often, we want to provide a lookup index for the dimension:
Here both X
and Ti
are dimensions from DimensionalData
. The currently exported dimensions are X, Y, Z, Ti
(Ti
is shortening of Time
).
The length of each dimension index has to match the size of the corresponding array axis.
@@ -607,19 +607,19 @@ Dimensions and DimArrays12×10 DimArray{Float64,2} with dimensions:
Dim{:time} Sampled{DateTime} DateTime("2001-01-01T00:00:00"):Month(1):DateTime("2001-12-01T00:00:00") ForwardOrdered Regular Points,
Dim{:distance} Sampled{Int64} 10:10:100 ForwardOrdered Regular Points
- … 80 90 100
- 2001-01-01T00:00:00 0.314094 0.876493 0.488724
- 2001-02-01T00:00:00 0.0102914 0.686881 0.0442961
- 2001-03-01T00:00:00 0.113609 0.718153 0.655143
- 2001-04-01T00:00:00 0.130198 0.557537 0.21255
- 2001-05-01T00:00:00 … 0.806614 0.458922 0.241154
- 2001-06-01T00:00:00 0.268379 0.994217 0.153776
- 2001-07-01T00:00:00 0.870931 0.651182 0.683836
- 2001-08-01T00:00:00 0.0860832 0.377475 0.165645
- 2001-09-01T00:00:00 0.912859 0.768381 0.926545
- 2001-10-01T00:00:00 … 0.748863 0.259785 0.296125
- 2001-11-01T00:00:00 0.0239111 0.511522 0.596048
- 2001-12-01T00:00:00 0.957322 0.299066 0.881629
+ … 80 90 100
+ 2001-01-01T00:00:00 0.546073 0.776708 0.475906
+ 2001-02-01T00:00:00 0.666282 0.248009 0.923467
+ 2001-03-01T00:00:00 0.349775 0.883104 0.039746
+ 2001-04-01T00:00:00 0.471359 0.63521 0.246456
+ 2001-05-01T00:00:00 … 0.770968 0.372262 0.548898
+ 2001-06-01T00:00:00 0.340405 0.620083 0.562722
+ 2001-07-01T00:00:00 0.468234 0.624977 0.351428
+ 2001-08-01T00:00:00 0.865936 0.263336 0.482265
+ 2001-09-01T00:00:00 0.483682 0.176646 0.978312
+ 2001-10-01T00:00:00 … 0.680192 0.973174 0.276208
+ 2001-11-01T00:00:00 0.141882 0.0246634 0.768738
+ 2001-12-01T00:00:00 0.469621 0.749869 0.515705
Symbols can be more convenient to use than defining custom dims with @dim
, but have some downsides. They don't inherit from a specific Dimension
type, so plots will not know what axis to put them on. They also cannot use the basic constructor methods like rand
or zeros
, as we cannot dispatch on Symbol
for Base methods without "type-piracy".
@@ -633,10 +633,10 @@ Indexing the array by name and ind
X Sampled{Int64} 10:30:100 ForwardOrdered Regular Points,
Ti Sampled{DateTime} DateTime("2001-01-01T00:00:00"):Month(2):DateTime("2001-11-01T00:00:00") ForwardOrdered Regular Points
2001-01-01T00:00:00 … 2001-11-01T00:00:00
- 10 0.616383 0.087949
- 40 0.10482 0.109812
- 70 0.846454 0.612431
- 100 0.62133 0.0964429
+ 10 0.542112 0.707524
+ 40 0.257827 0.482177
+ 70 0.125833 0.189332
+ 100 0.483298 0.445263
When specifying only one dimension, all elements of the other dimensions are assumed to be included:
A[X(1:3:10)]
@@ -645,10 +645,10 @@ Indexing the array by name and ind
X Sampled{Int64} 10:30:100 ForwardOrdered Regular Points,
Ti Sampled{DateTime} DateTime("2001-01-01T00:00:00"):Month(1):DateTime("2001-12-01T00:00:00") ForwardOrdered Regular Points
2001-01-01T00:00:00 … 2001-12-01T00:00:00
- 10 0.616383 0.377344
- 40 0.10482 0.757038
- 70 0.846454 0.0334377
- 100 0.62133 0.96555
+ 10 0.542112 0.826426
+ 40 0.257827 0.00017745
+ 70 0.125833 0.843983
+ 100 0.483298 0.580883
Indexing
@@ -708,13 +708,13 @@ 47.315 ns (0 allocations: 0 bytes)
+ 38.655 ns (0 allocations: 0 bytes)
1.0
and
println(@btime parent($A2)[1, 2])
- 4.500 ns (0 allocations: 0 bytes)
+ 4.400 ns (0 allocations: 0 bytes)
1.0
@@ -726,9 +726,9 @@ Specifying dims<
3×4×1 DimArray{Float64,3} with dimensions: X, Y, Ti
[:, :, 1]
- 2.72419 2.49783 2.37618 1.85908
- 3.45302 2.57787 2.76568 3.36199
- 3.67329 2.06017 1.90024 2.47226
+ 2.5247 1.75441 2.19061 2.4184
+ 0.868353 2.72675 3.0262 2.49353
+ 2.18482 2.57632 1.92604 3.68636
This also works in methods from Statistics
:
using Statistics
@@ -736,9 +736,9 @@ Specifying dims<
3×4×1 DimArray{Float64,3} with dimensions: X, Y, Ti
[:, :, 1]
- 0.544837 0.499567 0.475236 0.371816
- 0.690604 0.515575 0.553137 0.672398
- 0.734658 0.412034 0.380049 0.494452
+ 0.50494 0.350882 0.438123 0.483681
+ 0.173671 0.54535 0.60524 0.498706
+ 0.436964 0.515264 0.385208 0.737272
@@ -805,8 +805,8 @@ LookupArrays and SelectorsA2[distance=12 .. 35, time=Date(2001, 5) .. Date(2001, 7)]
@@ -823,7 +823,7 @@ LookupArrays and SelectorsA4 = rand(Ti(timespan), X(10:10:100))
A4[X(Near(35)), Ti(At(DateTime(2001,5)))]
0.06402993024635817
+0.8201236140901906
Without dim wrappers selectors must be in the right order, and specify all axes:
using Unitful
@@ -834,20 +834,20 @@ LookupArrays and SelectorsA5[1:5]
5-element Vector{Float64}:
- 0.48518270694426
- 0.009806663404159255
- 0.9956056644602331
- 0.8790389156104539
- 0.8772182200262983
+ 0.8926603158925618
+ 0.4029306517840252
+ 0.22671898658265388
+ 0.7936924607105116
+ 0.008231268361020616
But unless the DimArray
is one dimensional, this will return a regular Array
. It is not possible to keep the LookupArray
or even Dimension
s after linear indexing is used.
diff --git a/previews/PR528/reference/index.html b/previews/PR528/reference/index.html
index 9f910e837..a6a7fdedb 100644
--- a/previews/PR528/reference/index.html
+++ b/previews/PR528/reference/index.html
@@ -527,7 +527,7 @@ Arraysmetadata
, name
and refdims
methods, although these are optional.
A rebuild
method for AbstractDimArray
must accept data
, dims
, refdims
, name
, metadata
arguments.
Indexing AbstractDimArray
with non-range AbstractArray
has undefined effects on the Dimension
index. Use forward-ordered arrays only"
-
+
#
DimensionalData.DimArray
— Type.
DimArray <: AbstractDimArray
@@ -558,7 +558,7 @@ Arraysjulia> A[Near(DateTime(2001, 5, 4)), Between(20, 50)];
-
+
Multi-array datasets¤
@@ -578,7 +578,7 @@ Multi-array datasetsDimStack
for the concrete implementation. Most methods are defined on the abstract type.
To extend AbstractDimStack
, implement argument and keyword version of rebuild
and also rebuild_from_arrays
.
The constructor of an AbstractDimStack
must accept a NamedTuple
.
-
+
#
DimensionalData.DimStack
— Type.
DimStack <: AbstractDimStack
@@ -631,7 +631,7 @@ Multi-array datasetsjulia> s[X(At(:a))] isa DimStack
true
-
+
Dimension indices generators¤
@@ -645,7 +645,7 @@ Dimension indices generatorsDimKeys <: AbstractArray
@@ -655,7 +655,7 @@ Dimension indices generatorsDimKeys(dims::Dimension)
Like CartesianIndices
, but for the lookup values of Dimensions. Behaves as an Array
of Tuple
of Dimension(At(lookupvalue))
for all combinations of the lookup values of dims
.
#
DimensionalData.DimPoints
— Type.
DimPoints <: AbstractArray
@@ -670,7 +670,7 @@ Dimension indices generatorsTables.jl/TableTraits.jl interface¤
@@ -679,7 +679,7 @@ Tables.jl/TableTraits.jl interfaceAbstractDimTable <: Tables.AbstractColumns
Abstract supertype for dim tables
- +#
DimensionalData.DimTable
— Type.
DimTable <: AbstractDimTable
@@ -690,7 +690,7 @@ Tables.jl/TableTraits.jl interfaceThis table will have a column for the array data and columns for each Dimension
index, as a [DimColumn
]. These are lazy, and generated as required.
Column names are converted from the dimension types using DimensionalData.dim2key
. This means type Ti
becomes the column name :Ti
, and Dim{:custom}
becomes :custom
.
To get dimension columns, you can index with Dimension
(X()
) or Dimension
type (X
) as well as the regular Int
or Symbol
.
-
+
#
DimensionalData.DimColumn
— Type.
DimColumn{T,D<:Dimension} <: AbstractVector{T}
@@ -702,7 +702,7 @@ Tables.jl/TableTraits.jl interfacelength
is the product of all dim lengths (usually the length of the corresponding array data), while stride is the product of the preceding dimension lengths, which may or may not be the real stride of the corresponding array depending on the data type. For A isa Array
, the dimstride
will match the stride
.
When the second argument is a Tuple
of Dimension
, the length
and dimstride
fields are calculated from the dimensions, relative to the column dimension dim
.
This object will be returned as a column of DimTable
.
-
+
Common methods¤
@@ -715,7 +715,7 @@ Common methodsrefdims(x, [dims::Tuple]) => Tuple{Vararg{Dimension}}
@@ -724,7 +724,7 @@ Common methodsmetadata(x) => (object metadata)
@@ -733,7 +733,7 @@ Common methodsname(x) => Symbol
@@ -743,7 +743,7 @@ Common methodsCommon methods 20.0 0.0 0.0 0.0 0.0
30.0 0.0 0.0 0.0 0.0
-
+
#
DimensionalData.Dimensions.LookupArrays.rebuild
— Function.
rebuild(x, args...)
@@ -830,7 +830,7 @@ Common methodsmodify(f, A::AbstractDimArray) => AbstractDimArray
@@ -846,7 +846,7 @@ Common methodsmodify(CuArray, A)
This also works for all the data layers in a DimStack
.
-
+
#
DimensionalData.broadcast_dims
— Function.
broadcast_dims(f, sources::AbstractDimArray...) => AbstractDimArray
@@ -857,7 +857,7 @@ Common methodsbroadcast_dims!(f, dest::AbstractDimArray, sources::AbstractDimArray...) => dest
@@ -869,7 +869,7 @@ Common methodsreorder(A::AbstractDimArray, order::Pair) => AbstractDimArray
@@ -878,7 +878,7 @@ Common methodsOrder
, or Dimeension => Order
pairs.
If no axis reversal is required the same objects will be returned, without allocation.
-
+
#
Base.cat
— Function.
Base.cat(stacks::AbstractDimStack...; [keys=keys(stacks[1])], dims)
@@ -893,14 +893,14 @@ Common methodscat(stacks...; keys=(:sea_surface_temp, :humidity), dims=Ti)
-
+
#
Base.map
— Function.
Base.map(f, stacks::AbstractDimStack...)
Apply function f
to each layer of the stacks
.
If f
returns DimArray
s the result will be another DimStack
. Other values will be returned in a NamedTuple
.
-
+
#
Base.copy!
— Function.
Base.copy!(dst::AbstractArray, src::AbstractGimStack, key::Key)
@@ -910,7 +910,7 @@ Common methodscopy!(array, stack, :humidity)
-
+
Base.copy!(dst::AbstractDimStack, src::AbstractDimStack, [keys=keys(dst)])
Copy all or a subset of layers from one stack to another.
@@ -918,7 +918,7 @@ Common methodscopy!(dst::AbstractDimStack, src::AbstractDimStack, keys=(:sea_surface_temp, :humidity))
-
+
#
Base.eachslice
— Function.
Base.eachslice(stack::AbstractDimStack; dims)
@@ -948,7 +948,7 @@ Common methods :x Float64 dims: Y (3)
:y Float64 dims: Y, Ti (3×5)
-
+
Most base methods work as expected, using Dimension
wherever a dims
keyword is used. They are not allspecifically documented here.
Shorthand constructors:
#
@@ -970,7 +970,7 @@
Common methods<a target='_blank' href='https://github.com/rafaqz/DimensionalData.jl/blob/1adbb4c15daa9508f1eb5c71842237907c776fa6/src/array/array.jl#L378-L401' class='documenter-source'>source</a><br>
+<a target='_blank' href='https://github.com/rafaqz/DimensionalData.jl/blob/ec4d5a549948be8d18b5aca7506f582dbaba33ae/src/array/array.jl#L378-L401' class='documenter-source'>source</a><br>
<a id='Base.rand' href='#Base.rand'>#</a>
**`Base.rand`** — *Function*.
@@ -1006,7 +1006,7 @@ Common methods 0.752868 0.471638 0.193652
0.484558 0.846559 0.455256
-
+
#
Base.zeros
— Function.
Base.zeros(x, dims::Dimension...; kw...) => DimArray
@@ -1033,7 +1033,7 @@ Common methods<a target='_blank' href='https://github.com/rafaqz/DimensionalData.jl/blob/1adbb4c15daa9508f1eb5c71842237907c776fa6/src/array/array.jl#L440-L471' class='documenter-source'>source</a><br>
+<a target='_blank' href='https://github.com/rafaqz/DimensionalData.jl/blob/ec4d5a549948be8d18b5aca7506f582dbaba33ae/src/array/array.jl#L440-L471' class='documenter-source'>source</a><br>
<a id='Base.ones' href='#Base.ones'>#</a>
**`Base.ones`** — *Function*.
@@ -1065,7 +1065,7 @@ Common methods<a target='_blank' href='https://github.com/rafaqz/DimensionalData.jl/blob/1adbb4c15daa9508f1eb5c71842237907c776fa6/src/array/array.jl#L474-L505' class='documenter-source'>source</a><br>
+<a target='_blank' href='https://github.com/rafaqz/DimensionalData.jl/blob/ec4d5a549948be8d18b5aca7506f582dbaba33ae/src/array/array.jl#L474-L505' class='documenter-source'>source</a><br>
<a id='Dimensions'></a>
@@ -1092,7 +1092,7 @@ Common methodsCommon methods 4 0.0 0.0
Dimension
objects may have lookup
and metadata
fields to track additional information about the data and the index, and their relationship.
-
+
#
DimensionalData.Dimensions.DependentDim
— Type.
DependentDim <: Dimension
Abstract supertype for Dependent dimensions. These will plot on the Y axis.
-
+
#
DimensionalData.Dimensions.IndependentDim
— Type.
IndependentDim <: Dimension
Abstract supertype for independent dimensions. Thise will plot on the X axis.
-
+
#
DimensionalData.Dimensions.XDim
— Type.
XDim <: IndependentDim
Abstract supertype for all X dimensions.
-
+
#
DimensionalData.Dimensions.YDim
— Type.
YDim <: DependentDim
Abstract supertype for all Y dimensions.
-
+
#
DimensionalData.Dimensions.ZDim
— Type.
ZDim <: DependentDim
Abstract supertype for all Z dimensions.
-
+
#
DimensionalData.Dimensions.TimeDim
— Type.
TimeDim <: IndependentDim
Abstract supertype for all time dimensions.
In a TimeDime
with Interval
sampling the locus will automatically be set to Start()
. Dates and times generally refer to the start of a month, hour, second etc., not the central point as is more common with spatial data. `
-
+
#
DimensionalData.Dimensions.X
— Type.
X <: XDim
@@ -1211,7 +1211,7 @@ Common methods# Or
mean(A; dims=X)
-
+
#
DimensionalData.Dimensions.Y
— Type.
Y <: YDim
@@ -1226,7 +1226,7 @@ Common methods# Or
mean(A; dims=Y)
-
+
#
DimensionalData.Dimensions.Z
— Type.
Z <: ZDim
@@ -1241,7 +1241,7 @@ Common methods# Or
mean(A; dims=Z)
-
+
#
DimensionalData.Dimensions.Ti
— Type.
m Ti <: TimeDim
@@ -1256,7 +1256,7 @@ Common methods# Or
mean(A; dims=Ti)
-
+
#
DimensionalData.Dimensions.Dim
— Type.
Dim{S}(val=:)
@@ -1271,7 +1271,7 @@ Common methodsDim{:custom} Char['a', 'b', 'c']
-
+
#
DimensionalData.Dimensions.Coord
— Type.
Coord <: Dimension
@@ -1314,7 +1314,7 @@ Common methods 0.3
0.4
-
+
#
DimensionalData.Dimensions.AnonDim
— Type.
AnonDim <: Dimension
@@ -1322,7 +1322,7 @@ Common methodsAnonDim()
Anonymous dimension. Used when extra dimensions are created, such as during transpose of a vector.
-
+
#
DimensionalData.Dimensions.@dim
— Macro.
@dim typ [supertype=Dimension] [name::String=string(typ)]
@@ -1335,7 +1335,7 @@ Common methods@dim Lon XDim "Longitude"
# output
-
+
Exported methods¤
@@ -1367,7 +1367,7 @@ Exported methodsjulia> hasdim(A, Ti)
false
-
+
#
DimensionalData.Dimensions.dimnum
— Function.
dimnum(x, query::Tuple) => NTuple{Int}
@@ -1391,7 +1391,7 @@ Exported methodsjulia> dimnum(A, Y)
2
-
+
Non-exported methods¤
@@ -1404,7 +1404,7 @@ Non-exported methodsLookupArray
of a dimension. This dictates properties of the dimension such as array axis and index order, and sampling properties.
dims
can be a Dimension
, a dimension type, or a tuple of either.
-
+
#
DimensionalData.Dimensions.label
— Function.
label(x) => String
@@ -1414,7 +1414,7 @@ Non-exported methodsdim2key(dim::Dimension) => Symbol
@@ -1423,7 +1423,7 @@ Non-exported methods@dim
macro.
All other Dim{S}()
dimensions will generate Symbol
s S
.
-
+
#
DimensionalData.Dimensions.key2dim
— Function.
key2dim(s::Symbol) => Dimension
@@ -1432,19 +1432,19 @@ Non-exported methods@dim
macro.
All other Symbol
s S
will generate Dim{S}()
dimensions.
-
+
#
DimensionalData.Dimensions.dims2indices
— Function.
dims2indices(dim::Dimension, I) => NTuple{Union{Colon,AbstractArray,Int}}
Convert a Dimension
or Selector
I
to indices of Int
, AbstractArray
or Colon
.
-
+
#
DimensionalData.Dimensions.LookupArrays.selectindices
— Function.
selectindices(lookups, selectors)
Converts Selector
to regular indices.
-
+
#
DimensionalData.Dimensions.format
— Function.
format(dims, x) => Tuple{Vararg{Dimension,N}}
@@ -1452,14 +1452,14 @@ Non-exported methodsLookupArray
hasn't been specified, a lookup is chosen based on the type and element type of the index.
-
+
#
DimensionalData.Dimensions.reducedims
— Function.
reducedims(x, dimstoreduce) => Tuple{Vararg{Dimension}}
Replace the specified dimensions with an index of length 1. This is usually to match a new array size where an axis has been reduced with a method like mean
or reduce
to a length of 1, but the number of dimensions has not changed.
LookupArray
traits are also updated to correspond to the change in cell step, sampling type and order.
-
+
#
DimensionalData.Dimensions.swapdims
— Function.
swapdims(x::T, newdims) => T
@@ -1484,7 +1484,7 @@ Non-exported methods 1.0 1.0 1.0 1.0
[and 1 more slices...]
-
+
#
DimensionalData.Dimensions.slicedims
— Function.
slicedims(x, I) => Tuple{Tuple,Tuple}
@@ -1499,7 +1499,7 @@ Non-exported methodscomparedims(A::AbstractDimArray...; kw...)
@@ -1521,13 +1521,13 @@ Non-exported methodscombinedims(xs; check=true)
Combine the dimensions of each object in xs
, in the order they are found.
-
+
#
DimensionalData.Dimensions.otherdims
— Function.
otherdims(x, query) => Tuple{Vararg{Dimension,N}}
@@ -1551,7 +1551,7 @@ Non-exported methodsjulia> otherdims(A, (Y, Z))
X
-
+
#
DimensionalData.Dimensions.commondims
— Function.
commondims([f], x, query) => Tuple{Vararg{Dimension}}
@@ -1572,7 +1572,7 @@ Non-exported methodsjulia> commondims(A, Ti)
()
-
+
#
DimensionalData.Dimensions.sortdims
— Function.
sortdims([f], tosort, order) => Tuple
@@ -1580,14 +1580,14 @@ Non-exported methodsTimeDim
can be used in order
.
f
is <:
by default, but can be >:
to sort abstract types by concrete types.
-
+
#
DimensionalData.Dimensions.LookupArrays.basetypeof
— Function.
basetypeof(x) => Type
Get the "base" type of an object - the minimum required to define the object without it's fields. By default this is the full UnionAll
for the type. But custom basetypeof
methods can be defined for types with free type parameters.
In DimensionalData this is primariliy used for comparing Dimension
s, where Dim{:x}
is different from Dim{:y}
.
-
+
#
DimensionalData.Dimensions.setdims
— Function.
setdims(X, newdims) => AbstractArray
@@ -1608,7 +1608,7 @@ Non-exported methodsCategorical{Char} ForwardOrdered
wrapping: 'a':1:'j'
-
+
#
DimensionalData.Dimensions.dimsmatch
— Function.
dimsmatch([f], dim, query) => Bool
@@ -1616,7 +1616,7 @@ Non-exported methodsdimstride(x, dim) => Int
@@ -1628,7 +1628,7 @@ Non-exported methodsrefdims_title(A::AbstractDimArray)
@@ -1636,7 +1636,7 @@ Non-exported methodsrefdims_title(refdim::Dimension)
Generate a title string based on reference dimension values.
-
+
#
DimensionalData.rebuild_from_arrays
— Function.
rebuild_from_arrays(s::AbstractDimStack, das::NamedTuple{<:Any,<:Tuple{Vararg{AbstractDimArray}}}; kw...)
@@ -1652,7 +1652,7 @@ Non-exported methodsLookupArrays¤
@@ -1667,7 +1667,7 @@ LookupArraysusing DimensionalData
using DimensionalData.LookupArrays
-
+
Selectors¤
@@ -1686,19 +1686,19 @@ SelectorsWhere
Contains
-
+
#
DimensionalData.Dimensions.LookupArrays.IntSelector
— Type.
IntSelector <: Selector
Abstract supertype for Selector
s that return a single Int
index.
-
+
#
DimensionalData.Dimensions.LookupArrays.ArraySelector
— Type.
ArraySelector <: Selector
Abstract supertype for Selector
s that return an AbstractArray
.
-
+
#
DimensionalData.Dimensions.LookupArrays.At
— Type.
At <: IntSelector
@@ -1719,7 +1719,7 @@ Selectors5
-
+
#
DimensionalData.Dimensions.LookupArrays.Near
— Type.
Near <: IntSelector
@@ -1737,7 +1737,7 @@ Selectors# output
4
-
+
#
DimensionalData.Dimensions.LookupArrays.Between
— Type.
Between <: ArraySelector
@@ -1764,7 +1764,7 @@ Selectors 5 6
20 4 5
-
+
#
DimensionalData.Dimensions.LookupArrays.Touches
— Type.
Touches <: ArraySelector
@@ -1787,7 +1787,7 @@ Selectors 5 6
20 4 5
-
+
#
DimensionalData.Dimensions.LookupArrays.Contains
— Type.
Contains <: IntSelector
@@ -1806,7 +1806,7 @@ Selectors# output
3
-
+
#
DimensionalData.Dimensions.LookupArrays.Where
— Type.
Where <: ArraySelector
@@ -1828,7 +1828,7 @@ Selectors 19 21
20 4 6
-
+
#
DimensionalData.Dimensions.LookupArrays.All
— Type.
All <: Selector
@@ -1852,7 +1852,7 @@ Selectors 10.0 1 2 19 20
50.0 3 6 57 60
-
+
Lookup properties:
#
DimensionalData.Dimensions.LookupArrays.bounds
— Function.
@@ -1864,7 +1864,7 @@ Selectorsval(x)
@@ -1873,28 +1873,28 @@ SelectorsLookupArray
Types defining the behaviour of a lookup index, how it is plotted and how Selector
s like Between
work.
A LookupArray
may be NoLookup
indicating that the index is just the underlying array axis, Categorical
for ordered or unordered categories, or a Sampled
index for Points
or Intervals
.
-
+
#
DimensionalData.Dimensions.LookupArrays.Aligned
— Type.
Aligned <: LookupArray
Abstract supertype for LookupArray
s where the index is aligned with the array axes.
This is by far the most common supertype for LookupArray
.
-
+
#
DimensionalData.Dimensions.LookupArrays.AbstractSampled
— Type.
AbstractSampled <: Aligned
Abstract supertype for LookupArray
s where the index is aligned with the array, and is independent of other dimensions. Sampled
is provided by this package.
AbstractSampled
must have order
, span
and sampling
fields, or a rebuild
method that accpts them as keyword arguments.
-
+
#
DimensionalData.Dimensions.LookupArrays.Sampled
— Type.
Sampled <: AbstractSampled
@@ -1933,7 +1933,7 @@ Selectors 40 1.0 1.0 1.0 1.0
20 1.0 1.0 1.0 1.0
-
+
#
DimensionalData.Dimensions.LookupArrays.AbstractCategorical
— Type.
AbstractCategorical <: Aligned
@@ -1941,7 +1941,7 @@ SelectorsLookupArray
s where the values are categories.
Categorical
is the provided concrete implementation. but this can easily be extended - all methods are defined for AbstractCategorical
.
All AbstractCategorical
must provide a rebuild
method with data
, order
and metadata
keyword arguments.
-
+
#
DimensionalData.Dimensions.LookupArrays.Categorical
— Type.
Categorical <: AbstractCategorical
@@ -1971,14 +1971,14 @@ SelectorsCategorical{String} String["one", "two", "three"] Unordered,
Categorical{Symbol} Symbol[:a, :b, :c, :d] ForwardOrdered
-
+
#
DimensionalData.Dimensions.LookupArrays.Unaligned
— Type.
Unaligned <: LookupArray
Abstract supertype for LookupArray
where the index is not aligned to the grid.
Indexing an Unaligned
with Selector
s must provide all other Unaligned
dimensions.
-
+
#
DimensionalData.Dimensions.LookupArrays.Transformed
— Type.
Transformed <: Unaligned
@@ -2010,7 +2010,7 @@ Selectors# output
9
-
+
#
DimensionalData.Dimensions.MergedLookup
— Type.
MergedLookup <: LookupArray
@@ -2028,7 +2028,7 @@ SelectorsNoLookup <: LookupArray
@@ -2056,7 +2056,7 @@ SelectorsNoLookup, NoLookup
-
+
#
DimensionalData.Dimensions.LookupArrays.AutoLookup
— Type.
AutoLookup <: LookupArray
@@ -2066,13 +2066,13 @@ SelectorsLookupArray
, the default lookup. It will be converted automatically to another LookupArray
when it is possible to detect it from the index.
Keywords will be used in the detected LookupArray
constructor.
-
+
#
DimensionalData.Dimensions.LookupArrays.AutoIndex
— Type.
AutoIndex
Detect a LookupArray
index from the context. This is used in NoLookup
to simply use the array axis as the index when the array is constructed, and in set
to change the LookupArray
type without changing the index values.
-
+
Metadata¤
@@ -2083,7 +2083,7 @@ Metadataset
without ambiguity about where to put them.
-
+
#
DimensionalData.Dimensions.LookupArrays.Metadata
— Type.
Metadata <: AbstractMetadata
@@ -2093,7 +2093,7 @@ MetadataMetadata{X}(; kw...) => Metadata{NamedTuple}
General Metadata
object. The X
type parameter categorises the metadata for method dispatch, if required.
-
+
#
DimensionalData.Dimensions.LookupArrays.NoMetadata
— Type.
NoMetadata <: AbstractMetadata
@@ -2101,7 +2101,7 @@ MetadataNoMetadata()
Indicates an object has no metadata. But unlike using nothing
, get
, keys
and haskey
will still work on it, get
always returning the fallback argument. keys
returns ()
while haskey
always returns false
.
-
+
LookupArray traits¤
@@ -2112,7 +2112,7 @@ LookupArray traitsLookupArray
.
These modify the behaviour of the lookup index.
The term "Trait" is used loosely - these may be fields of an object of traits hard-coded to specific types.
-
+
Order¤
@@ -2121,13 +2121,13 @@ Order
Order <: LookupArrayTrait
Traits for the order of a LookupArray
. These determine how searchsorted
finds values in the index, and how objects are plotted.
-
+
#
DimensionalData.Dimensions.LookupArrays.Ordered
— Type.
Ordered <: Order
Supertype for the order of an ordered LookupArray
, including ForwardOrdered
and ReverseOrdered
.
-
+
#
DimensionalData.Dimensions.LookupArrays.ForwardOrdered
— Type.
ForwardOrdered <: Ordered
@@ -2135,7 +2135,7 @@ Order
ForwardOrdered()
Indicates that the LookupArray
index is in the normal forward order.
-
+
#
DimensionalData.Dimensions.LookupArrays.ReverseOrdered
— Type.
ReverseOrdered <: Ordered
@@ -2143,7 +2143,7 @@ Order
ReverseOrdered()
Indicates that the LookupArray
index is in the reverse order.
-
+
#
DimensionalData.Dimensions.LookupArrays.Unordered
— Type.
Indicates that LookupArray
is unordered.
This means the index cannot be searched with searchsortedfirst
or similar optimised methods - instead it will use findfirst
.
-
+
#
DimensionalData.Dimensions.LookupArrays.AutoOrder
— Type.
AutoOrder <: Order
@@ -2160,7 +2160,7 @@ Order
AutoOrder()
Specifies that the Order
of a LookupArray
will be found automatically where possible.
-
+
Span¤
@@ -2169,7 +2169,7 @@ Span¤
Span <: LookupArrayTrait
Defines the type of span used in a Sampling
index. These are Regular
or Irregular
.
-
+
#
DimensionalData.Dimensions.LookupArrays.Regular
— Type.
Regular <: Span
@@ -2177,7 +2177,7 @@ Span¤
Regular(step=AutoStep())
Points
or Intervals
that have a fixed, regular step.
-
+
#
DimensionalData.Dimensions.LookupArrays.Irregular
— Type.
Irregular <: Span
@@ -2186,14 +2186,14 @@ Span¤
Irregular(lowerbound, upperbound)
Points
or Intervals
that have an Irrigular
step size. To enable bounds tracking and accuract selectors, the starting bounds are provided as a 2 tuple, or 2 arguments. (nothing, nothing)
is acceptable input, the bounds will be guessed from the index, but may be innaccurate.
-
+
#
DimensionalData.Dimensions.LookupArrays.Explicit
— Type.
Explicit(bounds::AbstractMatix)
Intervals where the span is explicitly listed for every interval.
This uses a matrix where with length 2 columns for each index value, holding the lower and upper bounds for that specific index.
-
+
#
DimensionalData.Dimensions.LookupArrays.AutoSpan
— Type.
AutoSpan <: Span
@@ -2201,7 +2201,7 @@ Span¤
AutoSpan()
The span will be guessed and replaced in format
or set
.
-
+
Sampling¤
@@ -2210,7 +2210,7 @@ SamplingSampling <: LookupArrayTrait
Indicates the sampling method used by the index: Points
or Intervals
.
-
+
#
DimensionalData.Dimensions.LookupArrays.Points
— Type.
Points <: Sampling
@@ -2219,7 +2219,7 @@ SamplingSampling
lookup where single samples at exact points.
These are always plotted at the center of array cells.
-
+
#
DimensionalData.Dimensions.LookupArrays.Intervals
— Type.
Intervals <: Sampling
@@ -2228,7 +2228,7 @@ SamplingSampling
specifying that sampled values are the mean (or similar) value over an interval, rather than at one specific point.
Intervals require a Locus
of Start
, Center
or End
to define the location in the interval that the index values refer to.
-
+
Loci¤
@@ -2238,7 +2238,7 @@ Loci¤
Abstract supertype of types that indicate the position of index values where they represent Intervals
.
These allow for values array cells to align with the Start
, Center
, or End
of values in the lookup index.
This means they can be plotted with correct axis markers, and allows automatic converrsions to between formats with different standards (such as NetCDF and GeoTiff).
-
+
#
DimensionalData.Dimensions.LookupArrays.Center
— Type.
Center <: Locus
@@ -2246,7 +2246,7 @@ Loci¤
Center()
Indicates a lookup value is for the center of its corresponding array cell.
-
+
#
DimensionalData.Dimensions.LookupArrays.Start
— Type.
Start <: Locus
@@ -2254,7 +2254,7 @@ Loci¤
Start()
Indicates a lookup value is for the start of its corresponding array cell, in the direction of the lookup index order.
-
+
#
DimensionalData.Dimensions.LookupArrays.End
— Type.
End <: Locus
@@ -2262,7 +2262,7 @@ Loci¤
End()
Indicates a lookup value is for the end of its corresponding array cell, in the direction of the lookup index order.
-
+
#
DimensionalData.Dimensions.LookupArrays.AutoLocus
— Type.
AutoLocus <: Locus
@@ -2270,7 +2270,7 @@ Loci¤
AutoLocus()
Indicates a interval where the index position is not yet known. This will be filled with a default value on object construction.
-
+
LookupArrays methods¤
@@ -2280,14 +2280,14 @@ LookupArrays methodshasselection(x, selectors::Tuple) => Bool
Check if indexing into x with selectors
can be performed, where x is some object with a dims
method, and selectors
is a Selector
or Dimension
or a tuple of either.
-
+
#
DimensionalData.Dimensions.LookupArrays.shiftlocus
— Function.
shiftlocus(locus::Locus, x)
Shift the index of x
from the current locus to the new locus.
We only shift Sampled
, Regular
or Explicit
, Intervals
.
-
+
#
DimensionalData.Dimensions.LookupArrays.sampling
— Function.
sampling(x, [dims::Tuple]) => Tuple
@@ -2297,7 +2297,7 @@ LookupArrays methodsSampling
for each dimension.
Second argument dims
can be Dimension
s, Dimension
types, or Symbols
for Dim{Symbol}
.
-
+
#
DimensionalData.Dimensions.LookupArrays.span
— Function.
span(x, [dims::Tuple]) => Tuple
@@ -2307,7 +2307,7 @@ LookupArrays methodsSpan
for each dimension.
Second argument dims
can be Dimension
s, Dimension
types, or Symbols
for Dim{Symbol}
.
-
+
#
DimensionalData.Dimensions.LookupArrays.order
— Function.
order(x, [dims::Tuple]) => Tuple
@@ -2316,7 +2316,7 @@ LookupArrays methodsUnordered
Second argument dims
can be Dimension
s, Dimension
types, or Symbols
for Dim{Symbol}
.
-
+
#
DimensionalData.Dimensions.LookupArrays.index
— Function.
index(x) => Tuple{Vararg{AbstractArray}}
@@ -2328,7 +2328,7 @@ LookupArrays methodslocus(x, [dims::Tuple]) => Tuple
@@ -2338,7 +2338,7 @@ LookupArrays methodsLocus
for each dimension.
Second argument dims
can be Dimension
s, Dimension
types, or Symbols
for Dim{Symbol}
.
-
+
#
DimensionalData.Dimensions.LookupArrays.units
— Function.
units(x) => Union{Nothing,Any}
@@ -2349,7 +2349,7 @@ LookupArrays methodsName¤
@@ -2358,7 +2358,7 @@ Name¤
AbstractName
Abstract supertype for name wrappers.
-
+
#
DimensionalData.Name
— Type.
Name <: AbstractName
@@ -2367,7 +2367,7 @@ Name¤
Name(name::NoName) => NoName
Name wrapper. This lets arrays keep symbol names when the array wrapper neeeds to be `isbits, like for use on GPUs. It makes the name a property of the type. It's not necessary to use in normal use, a symbol is probably easier.
-
+
#
DimensionalData.NoName
— Type.
NoName <: AbstractName
@@ -2375,7 +2375,7 @@ Name¤
NoName()
NoName specifies an array is not named, and is the default name
value for all AAbstractDimArray
s.
-
+
diff --git a/previews/PR528/search/search_index.json b/previews/PR528/search/search_index.json
index 4cc4d06e4..84a439372 100644
--- a/previews/PR528/search/search_index.json
+++ b/previews/PR528/search/search_index.json
@@ -1 +1 @@
-{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Home","text":""},{"location":"#dimensionaldata","title":"DimensionalData","text":"DimensionalData.jl provides tools and abstractions for working with datasets that have named dimensions, and optionally a lookup index.
DimensionalData is a pluggable, generalised version of AxisArrays.jl with a cleaner syntax, and additional functionality found in NamedDims.jl. It has similar goals to pythons xarray, and is primarily written for use with spatial data in Rasters.jl.
"},{"location":"#goals","title":"Goals","text":" - Clean, readable syntax. Minimise required parentheses, minimise of exported
- Zero-cost dimensional indexing
a[Y(4), X(5)]
of a single value. methods, and instead extend Base methods whenever possible. - Plotting is easy: data should plot sensibly and correctly with useful labels, by default.
- Least surprise: everything works the same as in Base, but with named dims. If a method accepts numeric indices or
dims=X
in base, you should be able to use DimensionalData.jl dims. - Minimal interface: implementing a dimension-aware type should be easy.
- Maximum extensibility: always use method dispatch. Regular types over special syntax. Recursion over @generated. Always dispatch on abstract types.
- Type stability: dimensional methods should be type stable more often than Base methods
- Functional style: structs are always rebuilt, and other than the array data, fields are not mutated in place.
"},{"location":"#for-package-developers","title":"For package developers","text":""},{"location":"#data-types-and-the-interface","title":"Data types and the interface","text":"DimensionalData.jl provides the concrete DimArray
type. But its behaviours are intended to be easily applied to other array types.
more The main requirement for extending DimensionalData.jl is to define a dims
method that returns a Tuple
of Dimension
that matches the dimension order and axis values of your data. Define rebuild
and base methods for similar
and parent
if you want the metadata to persist through transformations (see the DimArray
and AbstractDimArray
types). A refdims
method returns the lost dimensions of a previous transformation, passed in to the rebuild
method. refdims
can be discarded, the main loss being plot labels and ability to reconstruct dimensions in cat
.
Inheriting from AbstractDimArray
in this way will give nearly all the functionality of using DimArray
.
"},{"location":"#lookuparrays-and-dimensions","title":"LookupArrays and Dimensions","text":"Sub modules LookupArrays
and Dimensions
define the behviour of dimensions and their lookup index.
LookupArrays
and Dimensions
"},{"location":"reference/","title":"Reference","text":""},{"location":"reference/#api","title":"API","text":""},{"location":"reference/#arrays","title":"Arrays","text":"# DimensionalData.AbstractDimArray
\u2014 Type.
AbstractDimArray <: AbstractArray\n
Abstract supertype for all \"dim\" arrays.
These arrays return a Tuple
of Dimension
from a dims
method, and can be rebuilt using rebuild
.
parent
must return the source array.
They should have metadata
, name
and refdims
methods, although these are optional.
A rebuild
method for AbstractDimArray
must accept data
, dims
, refdims
, name
, metadata
arguments.
Indexing AbstractDimArray
with non-range AbstractArray
has undefined effects on the Dimension
index. Use forward-ordered arrays only\"
source
# DimensionalData.DimArray
\u2014 Type.
DimArray <: AbstractDimArray\n\nDimArray(data, dims, refdims, name, metadata)\nDimArray(data, dims::Tuple; refdims=(), name=NoName(), metadata=NoMetadata())\n
The main concrete subtype of AbstractDimArray
.
DimArray
maintains and updates its Dimension
s through transformations and moves dimensions to reference dimension refdims
after reducing operations (like e.g. mean
).
Arguments
data
: An AbstractArray
. dims
: A Tuple
of Dimension
name
: A string name for the array. Shows in plots and tables. refdims
: refence dimensions. Usually set programmatically to track past slices and reductions of dimension for labelling and reconstruction. metadata
: Dict
or Metadata
object, or NoMetadata()
Indexing can be done with all regular indices, or with Dimension
s and/or Selector
s.
Indexing AbstractDimArray
with non-range AbstractArray
has undefined effects on the Dimension
index. Use forward-ordered arrays only\"
Example:
using Dates, DimensionalData\n\nti = (Ti(DateTime(2001):Month(1):DateTime(2001,12)),\nx = X(10:10:100))\nA = DimArray(rand(12,10), (ti, x), \"example\")\n\njulia> A[X(Near([12, 35])), Ti(At(DateTime(2001,5)))];\n\njulia> A[Near(DateTime(2001, 5, 4)), Between(20, 50)];\n
source
"},{"location":"reference/#multi-array-datasets","title":"Multi-array datasets","text":"# DimensionalData.AbstractDimStack
\u2014 Type.
AbstractDimStack\n
Abstract supertype for dimensional stacks.
These have multiple layers of data, but share dimensions.
Notably, their behaviour lies somewhere between a DimArray
and a NamedTuple
:
- indexing with a
Symbol
as in dimstack[:symbol]
returns a DimArray
layer. - iteration amd
map
are apply over array layers, as indexed with a Symbol
. getindex
and many base methods are applied as for DimArray
- to avoid the need to allways use map
.
This design gives very succinct code when working with many-layered, mixed-dimension objects. But it may be jarring initially - the most surprising outcome is that dimstack[1]
will return a NamedTuple
of values for the first index in all layers, while first(dimstack)
will return the first value of the iterator - the DimArray
for the first layer.
See DimStack
for the concrete implementation. Most methods are defined on the abstract type.
To extend AbstractDimStack
, implement argument and keyword version of rebuild
and also rebuild_from_arrays
.
The constructor of an AbstractDimStack
must accept a NamedTuple
.
source
# DimensionalData.DimStack
\u2014 Type.
DimStack <: AbstractDimStack\n\nDimStack(data::AbstractDimArray...)\nDimStack(data::Tuple{Vararg{AbstractDimArray}})\nDimStack(data::NamedTuple{Keys,Vararg{AbstractDimArray}})\nDimStack(data::NamedTuple, dims::DimTuple; metadata=NoMetadata())\n
DimStack holds multiple objects sharing some dimensions, in a NamedTuple
.
Notably, their behaviour lies somewhere between a DimArray
and a NamedTuple
:
- indexing with a
Symbol
as in dimstack[:symbol]
returns a DimArray
layer. - iteration amd
map
are apply over array layers, as indexed with a Symbol
. getindex
or view
with Int
, Dimension
s or Selector
s that resolve to Int
will return a NamedTuple
of values from each layer in the stack. This has very good performace, and avoids the need to always use map
. getindex
or view
with a Vector
or Colon
will return another DimStack
where all data layers have been sliced. setindex!
must pass a Tuple
or NamedTuple
maching the layers. - many base and
Statistics
methods (sum
, mean
etc) will work as for a DimArray
again removing the need to use map
.
For example, here we take the mean over the time dimension for all layers :
mean(mydimstack; dims=Ti)\n
And this equivalent to:
map(A -> mean(A; dims=Ti), mydimstack)\n
This design gives succinct code when working with many-layered, mixed-dimension objects.
But it may be jarring initially - the most surprising outcome is that dimstack[1]
will return a NamedTuple
of values for the first index in all layers, while first(dimstack)
will return the first value of the iterator - the DimArray
for the first layer.
DimStack
can be constructed from multiple AbstractDimArray
or a NamedTuple
of AbstractArray
and a matching dims
tuple.
Most Base
and Statistics
methods that apply to AbstractArray
can be used on all layers of the stack simulataneously. The result is a DimStack
, or a NamedTuple
if methods like mean
are used without dims
arguments, and return a single non-array value.
Example
julia> using DimensionalData\n\njulia> A = [1.0 2.0 3.0; 4.0 5.0 6.0];\n\njulia> dimz = (X([:a, :b]), Y(10.0:10.0:30.0))\nX Symbol[:a, :b],\nY 10.0:10.0:30.0\n\njulia> da1 = DimArray(1A, dimz; name=:one);\n\njulia> da2 = DimArray(2A, dimz; name=:two);\n\njulia> da3 = DimArray(3A, dimz; name=:three);\n\njulia> s = DimStack(da1, da2, da3);\n\njulia> s[At(:b), At(10.0)]\n(one = 4.0, two = 8.0, three = 12.0)\n\njulia> s[X(At(:a))] isa DimStack\ntrue\n
source
"},{"location":"reference/#dimension-indices-generators","title":"Dimension indices generators","text":"# DimensionalData.DimIndices
\u2014 Type.
DimIndices <: AbstractArray\n\nDimIndices(x)\nDimIndices(dims::Tuple)\nDimIndices(dims::Dimension)\n
Like CartesianIndices
, but for Dimension
s. Behaves as an Array
of Tuple
of Dimension(i)
for all combinations of the axis indices of dims
.
This can be used to view/index into arbitrary dimensions over an array, and is especially useful when combined with otherdims
, to iterate over the indices of unknown dimension.
source
# DimensionalData.DimKeys
\u2014 Type.
DimKeys <: AbstractArray\n\nDimKeys(x)\nDimKeys(dims::Tuple)\nDimKeys(dims::Dimension)\n
Like CartesianIndices
, but for the lookup values of Dimensions. Behaves as an Array
of Tuple
of Dimension(At(lookupvalue))
for all combinations of the lookup values of dims
.
source
# DimensionalData.DimPoints
\u2014 Type.
DimPoints <: AbstractArray\n\nDimPoints(x; order)\nDimPoints(dims::Tuple; order)\nDimPoints(dims::Dimension; order)\n
Like CartesianIndices
, but for the point values of the dimension index. Behaves as an Array
of Tuple
lookup values (whatever they are) for all combinations of the lookup values of dims
.
Either a Dimension
, a Tuple
of Dimension
or an object that defines a dims
method can be passed in.
Keywords
order
: determines the order of the points, the same as the order of dims
by default.
source
"},{"location":"reference/#tablesjltabletraitsjl-interface","title":"Tables.jl/TableTraits.jl interface","text":"# DimensionalData.AbstractDimTable
\u2014 Type.
AbstractDimTable <: Tables.AbstractColumns\n
Abstract supertype for dim tables
source
# DimensionalData.DimTable
\u2014 Type.
DimTable <: AbstractDimTable\n\nDimTable(A::AbstractDimArray)\n
Construct a Tables.jl/TableTraits.jl compatible object out of an AbstractDimArray
.
This table will have a column for the array data and columns for each Dimension
index, as a [DimColumn
]. These are lazy, and generated as required.
Column names are converted from the dimension types using DimensionalData.dim2key
. This means type Ti
becomes the column name :Ti
, and Dim{:custom}
becomes :custom
.
To get dimension columns, you can index with Dimension
(X()
) or Dimension
type (X
) as well as the regular Int
or Symbol
.
source
# DimensionalData.DimColumn
\u2014 Type.
DimColumn{T,D<:Dimension} <: AbstractVector{T}\n\nDimColumn(dim::Dimension, dims::Tuple{Vararg{DimTuple}})\nDimColumn(dim::DimColumn, length::Int, dimstride::Int)\n
A table column based on a Dimension
and it's relationship with other Dimension
s in dims
.
length
is the product of all dim lengths (usually the length of the corresponding array data), while stride is the product of the preceding dimension lengths, which may or may not be the real stride of the corresponding array depending on the data type. For A isa Array
, the dimstride
will match the stride
.
When the second argument is a Tuple
of Dimension
, the length
and dimstride
fields are calculated from the dimensions, relative to the column dimension dim
.
This object will be returned as a column of DimTable
.
source
"},{"location":"reference/#common-methods","title":"Common methods","text":"Common functions for obtaining information from objects:
# DimensionalData.Dimensions.dims
\u2014 Function.
dims(x, [dims::Tuple]) => Tuple{Vararg{Dimension}}\ndims(x, dim) => Dimension\n
Return a tuple of Dimension
s for an object, in the order that matches the axes or columns of the underlying data.
dims
can be Dimension
, Dimension
types, or Symbols
for Dim{Symbol}
.
The default is to return nothing
.
source
# DimensionalData.Dimensions.refdims
\u2014 Function.
refdims(x, [dims::Tuple]) => Tuple{Vararg{Dimension}}\nrefdims(x, dim) => Dimension\n
Reference dimensions for an array that is a slice or view of another array with more dimensions.
slicedims(a, dims)
returns a tuple containing the current new dimensions and the new reference dimensions. Refdims can be stored in a field or disgarded, as it is mostly to give context to plots. Ignoring refdims will simply leave some captions empty.
The default is to return an empty Tuple
()
.
source
# DimensionalData.Dimensions.LookupArrays.metadata
\u2014 Function.
metadata(x) => (object metadata)\nmetadata(x, dims::Tuple) => Tuple (Dimension metadata)\nmetadata(xs::Tuple) => Tuple\n
Returns the metadata for an object or for the specified dimension(s)
Second argument dims
can be Dimension
s, Dimension
types, or Symbols
for Dim{Symbol}
.
source
# DimensionalData.Dimensions.name
\u2014 Function.
name(x) => Symbol\nname(xs:Tuple) => NTuple{N,Symbol}\nname(x, dims::Tuple) => NTuple{N,Symbol}\nname(x, dim) => Symbol\n
Get the name of an array or Dimension, or a tuple of of either as a Symbol.
Second argument dims
can be Dimension
s, Dimension
types, or Symbols
for Dim{Symbol}
.
source
Utility methods for transforming DimensionalData objects:
# DimensionalData.Dimensions.LookupArrays.set
\u2014 Function.
set(x, val)\nset(x, args::Pairs...) => x with updated field/s\nset(x, args...; kw...) => x with updated field/s\nset(x, args::Tuple{Vararg{Dimension}}; kw...) => x with updated field/s\n\nset(dim::Dimension, index::AbstractArray) => Dimension\nset(dim::Dimension, lookup::LookupArray) => Dimension\nset(dim::Dimension, lookupcomponent::LookupArrayTrait) => Dimension\nset(dim::Dimension, metadata::AbstractMetadata) => Dimension\n
Set the properties of an object, its internal data or the traits of its dimensions and lookup index.
As DimensionalData is so strongly typed you do not need to specify what field of a LookupArray
to set
- there is no ambiguity.
To set fields of a LookupArray
you need to specify the dimension. This can be done using X => val
pairs, X = val
keyword arguments, or X(val)
wrapped arguments.
When a Dimension
or LookupArray
is passed to set
to replace the existing ones, fields that are not set will keep their original values.
Notes:
Changing a lookup index range/vector will also update the step size and order where applicable.
Setting the Order
like ForwardOrdered
will not reverse the array or dimension to match. Use reverse
and reorder
to do this.
Examples
julia> using DimensionalData; const DD = DimensionalData\nDimensionalData\n\njulia> da = DimArray(zeros(3, 4), (custom=10.0:010.0:30.0, Z=-20:010.0:10.0));\n\njulia> set(da, ones(3, 4))\n3\u00d74 DimArray{Float64,2} with dimensions:\n Dim{:custom} Sampled{Float64} 10.0:10.0:30.0 ForwardOrdered Regular Points,\n Z Sampled{Float64} -20.0:10.0:10.0 ForwardOrdered Regular Points\n -20.0 -10.0 0.0 10.0\n 10.0 1.0 1.0 1.0 1.0\n 20.0 1.0 1.0 1.0 1.0\n 30.0 1.0 1.0 1.0 1.0 \n
Change the Dimension
wrapper type:
julia> set(da, :Z => Ti, :custom => Z)\n3\u00d74 DimArray{Float64,2} with dimensions:\n Z Sampled{Float64} 10.0:10.0:30.0 ForwardOrdered Regular Points,\n Ti Sampled{Float64} -20.0:10.0:10.0 ForwardOrdered Regular Points\n -20.0 -10.0 0.0 10.0\n 10.0 0.0 0.0 0.0 0.0\n 20.0 0.0 0.0 0.0 0.0\n 30.0 0.0 0.0 0.0 0.0 \n
Change the lookup Vector
:
julia> set(da, Z => [:a, :b, :c, :d], :custom => [4, 5, 6])\n3\u00d74 DimArray{Float64,2} with dimensions:\n Dim{:custom} Sampled{Int64} Int64[4, 5, 6] ForwardOrdered Regular Points,\n Z Sampled{Symbol} Symbol[:a, :b, :c, :d] ForwardOrdered Regular Points\n :a :b :c :d\n 4 0.0 0.0 0.0 0.0\n 5 0.0 0.0 0.0 0.0\n 6 0.0 0.0 0.0 0.0\n
Change the LookupArray
type:
julia> set(da, Z=DD.NoLookup(), custom=DD.Sampled())\n3\u00d74 DimArray{Float64,2} with dimensions:\n Dim{:custom} Sampled{Float64} 10.0:10.0:30.0 ForwardOrdered Regular Points,\n Z\n 10.0 0.0 0.0 0.0 0.0\n 20.0 0.0 0.0 0.0 0.0\n 30.0 0.0 0.0 0.0 0.0\n
Change the Sampling
trait:
julia> set(da, :custom => DD.Irregular(10, 12), Z => DD.Regular(9.9))\n3\u00d74 DimArray{Float64,2} with dimensions:\n Dim{:custom} Sampled{Float64} 10.0:10.0:30.0 ForwardOrdered Irregular Points,\n Z Sampled{Float64} -20.0:10.0:10.0 ForwardOrdered Regular Points\n -20.0 -10.0 0.0 10.0\n 10.0 0.0 0.0 0.0 0.0\n 20.0 0.0 0.0 0.0 0.0\n 30.0 0.0 0.0 0.0 0.0\n
source
# DimensionalData.Dimensions.LookupArrays.rebuild
\u2014 Function.
rebuild(x, args...)\nrebuild(x; kw...)\n
Rebuild an object struct with updated field values.
x
can be a AbstractDimArray
, a Dimension
, LookupArray
or other custom types.
This is an abstraction that alows inbuilt and custom types to be rebuilt to update their fields, as most objects in DimensionalData.jl are immutable.
The arguments version can be concise but depends on a fixed order defined for some DimensionalData objects. It should be defined based on the object type in DimensionalData, adding the fields specific to your object.
The keyword version ignores order, and is mostly automated using ConstructionBase.setproperties
. It should only be defined if your object has missing fields or fields with different names to DimensionalData objects.
The arguments required are defined for the abstract type that has a rebuild
method.
source
# DimensionalData.modify
\u2014 Function.
modify(f, A::AbstractDimArray) => AbstractDimArray\nmodify(f, s::AbstractDimStack) => AbstractDimStack\nmodify(f, dim::Dimension) => Dimension\nmodify(f, x, lookupdim::Dimension) => typeof(x)\n
Modify the parent data, rebuilding the object wrapper without change. f
must return a AbstractArray
of the same size as the original.
This method is mostly useful as a way of swapping the parent array type of an object.
Example
If we have a previously-defined DimArray
, we can copy it to an Nvidia GPU with:
A = DimArray(rand(100, 100), (X, Y))\nmodify(CuArray, A)\n
This also works for all the data layers in a DimStack
.
source
# DimensionalData.broadcast_dims
\u2014 Function.
broadcast_dims(f, sources::AbstractDimArray...) => AbstractDimArray\n
Broadcast function f
over the AbstractDimArray
s in sources
, permuting and reshaping dimensions to match where required. The result will contain all the dimensions in all passed in arrays in the order in which they are found.
Arguments
sources
: AbstractDimArrays
to broadcast over with f
.
This is like broadcasting over every slice of A
if it is sliced by the dimensions of B
.
source
# DimensionalData.broadcast_dims!
\u2014 Function.
broadcast_dims!(f, dest::AbstractDimArray, sources::AbstractDimArray...) => dest\n
Broadcast function f
over the AbstractDimArray
s in sources
, writing to dest
. sources
are permuting and reshaping dimensions to match where required.
The result will contain all the dimensions in all passed in arrays, in the order in which they are found.
Arguments
dest
: AbstractDimArray
to update. sources
: AbstractDimArrays
to broadcast over with f
.
source
# DimensionalData.reorder
\u2014 Function.
reorder(A::AbstractDimArray, order::Pair) => AbstractDimArray\nreorder(A::Dimension, order::Order) => AbstractDimArray\n
Reorder every dims index/array to order
, or reorder index for the the given dimension(s) to the Order
they wrap.
order
can be an Order
, or Dimeension => Order
pairs.
If no axis reversal is required the same objects will be returned, without allocation.
source
# Base.cat
\u2014 Function.
Base.cat(stacks::AbstractDimStack...; [keys=keys(stacks[1])], dims)\n
Concatenate all or a subset of layers for all passed in stacks.
Keywords
keys
: Tuple
of Symbol
for the stack keys to concatenate. dims
: Dimension of child array to concatenate on.
Example
Concatenate the :seasurfacetemp and :humidity layers in the time dimension:
cat(stacks...; keys=(:sea_surface_temp, :humidity), dims=Ti)\n
source
# Base.map
\u2014 Function.
Base.map(f, stacks::AbstractDimStack...)\n
Apply function f
to each layer of the stacks
.
If f
returns DimArray
s the result will be another DimStack
. Other values will be returned in a NamedTuple
.
source
# Base.copy!
\u2014 Function.
Base.copy!(dst::AbstractArray, src::AbstractGimStack, key::Key)\n
Copy the stack layer key
to dst
, which can be any AbstractArray
.
Example
Copy the :humidity
layer from stack
to array
.
copy!(array, stack, :humidity)\n
source
Base.copy!(dst::AbstractDimStack, src::AbstractDimStack, [keys=keys(dst)])\n
Copy all or a subset of layers from one stack to another.
Example
Copy just the :sea_surface_temp
and :humidity
layers from src
to dst
.
copy!(dst::AbstractDimStack, src::AbstractDimStack, keys=(:sea_surface_temp, :humidity))\n
source
# Base.eachslice
\u2014 Function.
Base.eachslice(stack::AbstractDimStack; dims)\n
Create a generator that iterates over dimensions dims
of stack
, returning stacks that select all the data from the other dimensions in stack
using views.
The generator has size
and axes
equivalent to those of the provided dims
.
Examples
julia> ds = DimStack((\nx=DimArray(randn(2, 3, 4), (X([:x1, :x2]), Y(1:3), Z)),\ny=DimArray(randn(2, 3, 5), (X([:x1, :x2]), Y(1:3), Ti))\n));\n\njulia> slices = eachslice(ds; dims=(Z, X));\n\njulia> size(slices)\n(4, 2)\n\njulia> map(dims, axes(slices))\nZ,\nX Categorical{Symbol} Symbol[x1, x2] ForwardOrdered\n\njulia> first(slices)\nDimStack with dimensions:\nY Sampled{Int64} 1:3 ForwardOrdered Regular Points,\nTi\nand 2 layers:\n:x Float64 dims: Y (3)\n:y Float64 dims: Y, Ti (3\u00d75)\n
source
Most base methods work as expected, using Dimension
wherever a dims
keyword is used. They are not allspecifically documented here.
Shorthand constructors:
# Base.fill
\u2014 Function.
Base.fill(x, dims::Dimension...; kw...) => DimArray\nBase.fill(x, dims::Tuple{Vararg{Dimension}}; kw...) => DimArray\n
Create a DimArray
with a fill value of x
.
There are two kinds of Dimension
value acepted:
- A
Dimension
holding an AbstractVector
will set the dimension index to that AbstractVector
, and detect the dimension lookup. - A
Dimension
holding an Integer
will set the length of the axis, and set the dimension lookup to NoLookup
.
Keywords are the same as for DimArray
.
Example
```@doctest julia> using DimensionalData
julia> rand(Bool, X(2), Y(4)) 2\u00d74 DimArray{Bool,2} with dimensions: X, Y 1 0 0 1 1 0 1 1
<a target='_blank' href='https://github.com/rafaqz/DimensionalData.jl/blob/1adbb4c15daa9508f1eb5c71842237907c776fa6/src/array/array.jl#L378-L401' class='documenter-source'>source</a><br>\n\n<a id='Base.rand' href='#Base.rand'>#</a>\n**`Base.rand`** — *Function*.\n\n\n\n```julia\nBase.rand(x, dims::Dimension...; kw...) => DimArray\nBase.rand(x, dims::Tuple{Vararg{Dimension}}; kw...) => DimArray\nBase.rand(r::AbstractRNG, x, dims::Tuple{Vararg{Dimension}}; kw...) => DimArray\nBase.rand(r::AbstractRNG, x, dims::Dimension...; kw...) => DimArray\n
Create a DimArray
of random values.
There are two kinds of Dimension
value acepted:
- A
Dimension
holding an AbstractVector
will set the dimension index to that AbstractVector
, and detect the dimension lookup. - A
Dimension
holding an Integer
will set the length of the axis, and set the dimension lookup to NoLookup
.
Keywords are the same as for DimArray
.
Example
julia> using DimensionalData\n\njulia> rand(Bool, X(2), Y(4))\n2\u00d74 DimArray{Bool,2} with dimensions: X, Y\n1 0 0 1\n1 0 1 1\n\njulia> rand(X([:a, :b, :c]), Y(100.0:50:200.0))\n3\u00d73 DimArray{Float64,2} with dimensions:\nX: Symbol[a, b, c] Categorical: Unordered,\nY: 100.0:50.0:200.0 Sampled: Ordered Regular Points\n0.43204 0.835111 0.624231\n0.752868 0.471638 0.193652\n0.484558 0.846559 0.455256\n
source
# Base.zeros
\u2014 Function.
Base.zeros(x, dims::Dimension...; kw...) => DimArray\nBase.zeros(x, dims::Tuple{Vararg{Dimension}}; kw...) => DimArray\n
Create a DimArray
of zeros.
There are two kinds of Dimension
value acepted:
- A
Dimension
holding an AbstractVector
will set the dimension index to that AbstractVector
, and detect the dimension lookup. - A
Dimension
holding an Integer
will set the length of the axis, and set the dimension lookup to NoLookup
.
Keywords are the same as for DimArray
.
Example
```@doctest julia> using DimensionalData
julia> zeros(Bool, X(2), Y(4)) 2\u00d74 DimArray{Bool,2} with dimensions: X, Y 0 0 0 0 0 0 0 0
julia> zeros(X([:a, :b, :c]), Y(100.0:50:200.0)) 3\u00d73 DimArray{Float64,2} with dimensions: X: Symbol[a, b, c] Categorical: Unordered, Y: 100.0:50.0:200.0 Sampled: Ordered Regular Points 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<a target='_blank' href='https://github.com/rafaqz/DimensionalData.jl/blob/1adbb4c15daa9508f1eb5c71842237907c776fa6/src/array/array.jl#L440-L471' class='documenter-source'>source</a><br>\n\n<a id='Base.ones' href='#Base.ones'>#</a>\n**`Base.ones`** — *Function*.\n\n\n\n```julia\nBase.ones(x, dims::Dimension...; kw...) => DimArray\nBase.ones(x, dims::Tuple{Vararg{Dimension}}; kw...) => DimArray\n
Create a DimArray
of ones.
There are two kinds of Dimension
value acepted:
- A
Dimension
holding an AbstractVector
will set the dimension index to that AbstractVector
, and detect the dimension lookup. - A
Dimension
holding an Integer
will set the length of the axis, and set the dimension lookup to NoLookup
.
Keywords are the same as for DimArray
.
Example
```@doctest julia> using DimensionalData
julia> ones(Bool, X(2), Y(4)) 2\u00d74 DimArray{Bool,2} with dimensions: X, Y 1 1 1 1 1 1 1 1
julia> ones(X([:a, :b, :c]), Y(100.0:50:200.0)) 3\u00d73 DimArray{Float64,2} with dimensions: X: Symbol[a, b, c] Categorical: Unordered, Y: 100.0:50.0:200.0 Sampled: Ordered Regular Points 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
<a target='_blank' href='https://github.com/rafaqz/DimensionalData.jl/blob/1adbb4c15daa9508f1eb5c71842237907c776fa6/src/array/array.jl#L474-L505' class='documenter-source'>source</a><br>\n\n\n<a id='Dimensions'></a>\n\n<a id='Dimensions-1'></a>\n\n# Dimensions\n\n\nHandling of Dimensions is kept in a sub-module `Dimensions`.\n\n<a id='DimensionalData.Dimensions' href='#DimensionalData.Dimensions'>#</a>\n**`DimensionalData.Dimensions`** — *Module*.\n\n\n\nDimensions\n\nSub-module for [`Dimension`](reference.md#DimensionalData.Dimensions.Dimension)s wrappers, and operations on them used in DimensionalData.jl.\n\nTo load `Dimensions` types and methods into scope:\n\n```julia\nusing DimensionalData\nusing DimensionalData.Dimensions\n
source
Dimensions have a type-heirarchy that organises plotting and dimension matching.
# DimensionalData.Dimensions.Dimension
\u2014 Type.
Dimension\n
Abstract supertype of all dimension types.
Example concrete implementations are X
, Y
, Z
, Ti
(Time), and the custom [Dim
]@ref) dimension.
Dimension
s label the axes of an AbstractDimArray
, or other dimensional objects, and are used to index into the array.
They may also provide an alternate index to lookup for each array axis. This may be any AbstractVector
matching the array axis length, or a Val
holding a tuple for compile-time index lookups.
Dimension
s also have lookup
and metadata
fields.
lookup
gives more details about the dimension, such as that it is Categorical
or Sampled
as Points
or Intervals
along some transect. DimensionalData will attempt to guess the lookup from the passed-in index value.
Example:
using DimensionalData, Dates\n\nx = X(2:2:10)\ny = Y(['a', 'b', 'c'])\nti = Ti(DateTime(2021, 1):Month(1):DateTime(2021, 12))\n\nA = DimArray(zeros(3, 5, 12), (y, x, ti))\n\n# output\n\n3\u00d75\u00d712 DimArray{Float64,3} with dimensions:\nY Categorical{Char} Char['a', 'b', 'c'] ForwardOrdered,\nX Sampled{Int64} 2:2:10 ForwardOrdered Regular Points,\nTi Sampled{DateTime} DateTime(\"2021-01-01T00:00:00\"):Month(1):DateTime(\"2021-12-01T00:00:00\") ForwardOrdered Regular Points\n[:, :, 1]\n2 4 6 8 10\n'a' 0.0 0.0 0.0 0.0 0.0\n'b' 0.0 0.0 0.0 0.0 0.0\n'c' 0.0 0.0 0.0 0.0 0.0\n[and 11 more slices...]\n
For simplicity, the same Dimension
types are also used as wrappers in getindex
, like:
x = A[X(2), Y(3)]\n\n# output\n\n12-element DimArray{Float64,1} with dimensions:\nTi Sampled{DateTime} DateTime(\"2021-01-01T00:00:00\"):Month(1):DateTime(\"2021-12-01T00:00:00\") ForwardOrdered Regular Points\nand reference dimensions:\nY Categorical{Char} Char['c'] ForwardOrdered,\nX Sampled{Int64} 4:2:4 ForwardOrdered Regular Points\n2021-01-01T00:00:00 0.0\n2021-02-01T00:00:00 0.0\n2021-03-01T00:00:00 0.0\n2021-04-01T00:00:00 0.0\n\u22ee\n2021-10-01T00:00:00 0.0\n2021-11-01T00:00:00 0.0\n2021-12-01T00:00:00 0.0\n
A Dimension
can also wrap Selector
.
x = A[X(Between(3, 4)), Y(At('b'))]\n\n# output\n\n1\u00d712 DimArray{Float64,2} with dimensions:\nX Sampled{Int64} 4:2:4 ForwardOrdered Regular Points,\nTi Sampled{DateTime} DateTime(\"2021-01-01T00:00:00\"):Month(1):DateTime(\"2021-12-01T00:00:00\") ForwardOrdered Regular Points\nand reference dimensions:\nY Categorical{Char} Char['b'] ForwardOrdered\n2021-01-01T00:00:00 \u2026 2021-12-01T00:00:00\n4 0.0 0.0\n
Dimension
objects may have lookup
and metadata
fields to track additional information about the data and the index, and their relationship.
source
# DimensionalData.Dimensions.DependentDim
\u2014 Type.
DependentDim <: Dimension\n
Abstract supertype for Dependent dimensions. These will plot on the Y axis.
source
# DimensionalData.Dimensions.IndependentDim
\u2014 Type.
IndependentDim <: Dimension\n
Abstract supertype for independent dimensions. Thise will plot on the X axis.
source
# DimensionalData.Dimensions.XDim
\u2014 Type.
XDim <: IndependentDim\n
Abstract supertype for all X dimensions.
source
# DimensionalData.Dimensions.YDim
\u2014 Type.
YDim <: DependentDim\n
Abstract supertype for all Y dimensions.
source
# DimensionalData.Dimensions.ZDim
\u2014 Type.
ZDim <: DependentDim\n
Abstract supertype for all Z dimensions.
source
# DimensionalData.Dimensions.TimeDim
\u2014 Type.
TimeDim <: IndependentDim\n
Abstract supertype for all time dimensions.
In a TimeDime
with Interval
sampling the locus will automatically be set to Start()
. Dates and times generally refer to the start of a month, hour, second etc., not the central point as is more common with spatial data. `
source
# DimensionalData.Dimensions.X
\u2014 Type.
X <: XDim\n\nX(val=:)\n
X Dimension
. X <: XDim <: IndependentDim
Example:
xdim = X(2:2:10)\n# Or\nval = A[X(1)]\n# Or\nmean(A; dims=X)\n
source
# DimensionalData.Dimensions.Y
\u2014 Type.
Y <: YDim\n\nY(val=:)\n
Y Dimension
. Y <: YDim <: DependentDim
Example:
ydim = Y(['a', 'b', 'c'])\n# Or\nval = A[Y(1)]\n# Or\nmean(A; dims=Y)\n
source
# DimensionalData.Dimensions.Z
\u2014 Type.
Z <: ZDim\n\nZ(val=:)\n
Z Dimension
. Z <: ZDim <: Dimension
Example:
zdim = Z(10:10:100)\n# Or\nval = A[Z(1)]\n# Or\nmean(A; dims=Z)\n
source
# DimensionalData.Dimensions.Ti
\u2014 Type.
m Ti <: TimeDim
Ti(val=:)\n
Time Dimension
. Ti <: TimeDim <: IndependentDim
Time
is already used by Dates, and T
is a common type parameter, We use Ti
to avoid clashes.
Example:
timedim = Ti(DateTime(2021, 1):Month(1):DateTime(2021, 12))\n# Or\nval = A[Ti(1)]\n# Or\nmean(A; dims=Ti)\n
source
# DimensionalData.Dimensions.Dim
\u2014 Type.
Dim{S}(val=:)\n
A generic dimension. For use when custom dims are required when loading data from a file. Can be used as keyword arguments for indexing.
Dimension types take precedence over same named Dim
types when indexing with symbols, or e.g. creating Tables.jl keys.
using DimensionalData\n\ndim = Dim{:custom}(['a', 'b', 'c'])\n\n# output\n\nDim{:custom} Char['a', 'b', 'c']\n
source
# DimensionalData.Dimensions.Coord
\u2014 Type.
Coord <: Dimension\n
A coordinate dimension itself holds dimensions.
This allows combining point data with other dimensions, such as time.
Example
julia> using DimensionalData\n\njulia> dim = Coord([(1.0,1.0,1.0), (1.0,2.0,2.0), (3.0,4.0,4.0), (1.0,3.0,4.0)], (X(), Y(), Z()))\nCoord ::\nval: Tuple{Float64, Float64, Float64}[(1.0, 1.0, 1.0), (1.0, 2.0, 2.0), (3.0, 4.0, 4.0), (1.0, 3.0,\n4.0)]\nlookup: MergedLookup\nCoord{Vector{Tuple{Float64, Float64, Float64}}, DimensionalData.MergedLookup{Tuple{X{Colon, AutoLookup{Auto\nOrder}, NoMetadata}, Y{Colon, AutoLookup{AutoOrder}, NoMetadata}, Z{Colon, AutoLookup{AutoOrder}, NoMetada\nta}}}, NoMetadata}\n\njulia> da = DimArray(0.1:0.1:0.4, dim)\n4-element DimArray{Float64,1} with dimensions:\nCoord (): Tuple{Float64, Float64, Float64}[(1.0, 1.0, 1.0), (1.0, 2.0, 2.0), (3.0, 4.0, 4.0), (1.0,\n3.0, 4.0)]\nMergedLookup\n0.1\n0.2\n0.3\n0.4\n\njulia> da[Coord(Z(At(1.0)), Y(Between(1, 3)))]\n1-element DimArray{Float64,1} with dimensions:\nCoord (): Tuple{Float64, Float64, Float64}[(1.0, 1.0, 1.0)] MergedLookup\n0.1\n\njulia> da[Coord(4)] == 0.4\ntrue\n\njulia> da[Coord(Between(1, 5), :, At(4.0))]\n2-element DimArray{Float64,1} with dimensions:\nCoord (): Tuple{Float64, Float64, Float64}[(3.0, 4.0, 4.0), (1.0, 3.0, 4.0)] MergedLookup\n0.3\n0.4\n
source
# DimensionalData.Dimensions.AnonDim
\u2014 Type.
AnonDim <: Dimension\n\nAnonDim()\n
Anonymous dimension. Used when extra dimensions are created, such as during transpose of a vector.
source
# DimensionalData.Dimensions.@dim
\u2014 Macro.
@dim typ [supertype=Dimension] [name::String=string(typ)]\n
Macro to easily define new dimensions. The supertype will be inserted into the type of the dim. The default is simply YourDim <: Dimension
. Making a Dimesion inherit from XDim
, YDim
, ZDim
or TimeDim
will affect automatic plot layout and other methods that dispatch on these types. <: YDim
are plotted on the Y axis, <: XDim
on the X axis, etc.
Example:
using DimensionalData\nusing DimensionalData: @dim, YDim, XDim\n@dim Lat YDim \"latitude\"\n@dim Lon XDim \"Longitude\"\n# output\n
source
"},{"location":"reference/#exported-methods","title":"Exported methods","text":"# DimensionalData.Dimensions.hasdim
\u2014 Function.
hasdim([f], x, query::Tuple) => NTUple{Bool}\nhasdim([f], x, query...) => NTUple{Bool}\nhasdim([f], x, query) => Bool\n
Check if an object x
has dimensions that match or inherit from the query
dimensions.
Arguments
x
: any object with a dims
method, a Tuple
of Dimension
or a single Dimension
. query
: Tuple or single Dimension
or dimension Type
. f
: <:
by default, but can be >:
to match abstract types to concrete types.
Check if an object or tuple contains an Dimension
, or a tuple of dimensions.
Example
julia> using DimensionalData\n\njulia> A = DimArray(ones(10, 10, 10), (X, Y, Z));\n\njulia> hasdim(A, X)\ntrue\n\njulia> hasdim(A, (Z, X, Y))\n(true, true, true)\n\njulia> hasdim(A, Ti)\nfalse\n
source
# DimensionalData.Dimensions.dimnum
\u2014 Function.
dimnum(x, query::Tuple) => NTuple{Int}\ndimnum(x, query) => Int\n
Get the number(s) of Dimension
(s) as ordered in the dimensions of an object.
Arguments
x
: any object with a dims
method, a Tuple
of Dimension
or a single Dimension
. query
: Tuple, Array or single Dimension
or dimension Type
.
The return type will be a Tuple of Int
or a single Int
, depending on wether query
is a Tuple
or single Dimension
.
Example
julia> using DimensionalData\n\njulia> A = DimArray(ones(10, 10, 10), (X, Y, Z));\n\njulia> dimnum(A, (Z, X, Y))\n(3, 1, 2)\n\njulia> dimnum(A, Y)\n2\n
source
"},{"location":"reference/#non-exported-methods","title":"Non-exported methods","text":"# DimensionalData.Dimensions.lookup
\u2014 Function.
lookup(x::Dimension) => LookupArray\nlookup(x, [dims::Tuple]) => Tuple{Vararg{LookupArray}}\nlookup(x::Tuple) => Tuple{Vararg{LookupArray}}\nlookup(x, dim) => LookupArray\n
Returns the LookupArray
of a dimension. This dictates properties of the dimension such as array axis and index order, and sampling properties.
dims
can be a Dimension
, a dimension type, or a tuple of either.
source
# DimensionalData.Dimensions.label
\u2014 Function.
label(x) => String\nlabel(x, dims::Tuple) => NTuple{N,String}\nlabel(x, dim) => String\nlabel(xs::Tuple) => NTuple{N,String}\n
Get a plot label for data or a dimension. This will include the name and units if they exist, and anything else that should be shown on a plot.
Second argument dims
can be Dimension
s, Dimension
types, or Symbols
for Dim{Symbol}
.
source
# DimensionalData.Dimensions.dim2key
\u2014 Function.
dim2key(dim::Dimension) => Symbol\ndim2key(dims::Type{<:Dimension}) => Symbol\ndim2key(dims::Tuple) => Tuple{Symbol,Vararg}\n
Convert a dimension object to a simbol. X()
, Y()
, Ti()
etc will be converted. to :X
, :Y
, :Ti
, as with any other dims generated with the @dim
macro.
All other Dim{S}()
dimensions will generate Symbol
s S
.
source
# DimensionalData.Dimensions.key2dim
\u2014 Function.
key2dim(s::Symbol) => Dimension\nkey2dim(dims...) => Tuple{Dimension,Vararg}\nkey2dim(dims::Tuple) => Tuple{Dimension,Vararg}\n
Convert a symbol to a dimension object. :X
, :Y
, :Ti
etc will be converted. to X()
, Y()
, Ti()
, as with any other dims generated with the @dim
macro.
All other Symbol
s S
will generate Dim{S}()
dimensions.
source
# DimensionalData.Dimensions.dims2indices
\u2014 Function.
dims2indices(dim::Dimension, I) => NTuple{Union{Colon,AbstractArray,Int}}\n
Convert a Dimension
or Selector
I
to indices of Int
, AbstractArray
or Colon
.
source
# DimensionalData.Dimensions.LookupArrays.selectindices
\u2014 Function.
selectindices(lookups, selectors)\n
Converts Selector
to regular indices.
source
# DimensionalData.Dimensions.format
\u2014 Function.
format(dims, x) => Tuple{Vararg{Dimension,N}}\n
Format the passed-in dimension(s) dims
to match the object x
.
Errors are thrown if dims don't match the array dims or size, and any fields holding Auto-
objects are filled with guessed objects.
If a LookupArray
hasn't been specified, a lookup is chosen based on the type and element type of the index.
source
# DimensionalData.Dimensions.reducedims
\u2014 Function.
reducedims(x, dimstoreduce) => Tuple{Vararg{Dimension}}\n
Replace the specified dimensions with an index of length 1. This is usually to match a new array size where an axis has been reduced with a method like mean
or reduce
to a length of 1, but the number of dimensions has not changed.
LookupArray
traits are also updated to correspond to the change in cell step, sampling type and order.
source
# DimensionalData.Dimensions.swapdims
\u2014 Function.
swapdims(x::T, newdims) => T\nswapdims(dims::Tuple, newdims) => Tuple{Vararg{Dimension}}\n
Swap dimensions for the passed in dimensions, in the order passed.
Passing in the Dimension
types rewraps the dimension index, keeping the index values and metadata, while constructed Dimension
objectes replace the original dimension. nothing
leaves the original dimension as-is.
Arguments
x
: any object with a dims
method or a Tuple
of Dimension
. newdim
: Tuple of Dimension
or dimension Type
.
Example
using DimensionalData\nA = ones(X(2), Y(4), Z(2))\nDimensions.swapdims(A, (Dim{:a}, Dim{:b}, Dim{:c}))\n\n# output\n2\u00d74\u00d72 DimArray{Float64,3} with dimensions: Dim{:a}, Dim{:b}, Dim{:c}\n[:, :, 1]\n1.0 1.0 1.0 1.0\n1.0 1.0 1.0 1.0\n[and 1 more slices...]\n
source
# DimensionalData.Dimensions.slicedims
\u2014 Function.
slicedims(x, I) => Tuple{Tuple,Tuple}\nslicedims(f, x, I) => Tuple{Tuple,Tuple}\n
Slice the dimensions to match the axis values of the new array.
All methods return a tuple conatining two tuples: the new dimensions, and the reference dimensions. The ref dimensions are no longer used in the new struct but are useful to give context to plots.
Called at the array level the returned tuple will also include the previous reference dims attached to the array.
Arguments
f
: a function getindex
, view
or dotview
. This will be used for slicing getindex
is the default if f
is not included. x
: An AbstractDimArray
, Tuple
of Dimension
, or Dimension
I
: A tuple of Integer
, Colon
or AbstractArray
source
# DimensionalData.Dimensions.comparedims
\u2014 Function.
comparedims(A::AbstractDimArray...; kw...)\ncomparedims(A::Tuple...; kw...)\ncomparedims(A::Dimension...; kw...)\ncomparedims(::Type{Bool}, args...; kw...)\n
Check that dimensions or tuples of dimensions passed as each argument are the same, and return the first valid dimension. If AbstractDimArray
s are passed as arguments their dimensions are compared.
Empty tuples and nothing
dimension values are ignored, returning the Dimension
value if it exists.
Passing Bool
as the first argument means true
/false
will be returned, rather than throwing an error.
Keywords
These are all Bool
flags:
type
: compare dimension type, true
by default. valtype
: compare wrapped value type, false
by default. val
: compare wrapped values, false
by default. order
: compare order, false
by default. length
: compare lengths, true
by default. ignore_length_one
: ignore length 1
in comparisons, and return whichever dimension is not length 1, if any. This is useful in e.g. broadcasting comparisons. false
by default. warn
: a String
or nothing
. Used only for Bool
methods, to give a warning for false
values and include warn
in the warning text.
source
# DimensionalData.Dimensions.combinedims
\u2014 Function.
combinedims(xs; check=true)\n
Combine the dimensions of each object in xs
, in the order they are found.
source
# DimensionalData.Dimensions.otherdims
\u2014 Function.
otherdims(x, query) => Tuple{Vararg{Dimension,N}}\n
Get the dimensions of an object not in query
.
Arguments
x
: any object with a dims
method, a Tuple
of Dimension
. query
: Tuple or single Dimension
or dimension Type
. f
: <:
by default, but can be >:
to match abstract types to concrete types.
A tuple holding the unmatched dimensions is always returned.
Example
julia> using DimensionalData, DimensionalData.Dimensions\n\njulia> A = DimArray(ones(10, 10, 10), (X, Y, Z));\n\njulia> otherdims(A, X)\nY, Z\n\njulia> otherdims(A, (Y, Z))\nX\n
source
# DimensionalData.Dimensions.commondims
\u2014 Function.
commondims([f], x, query) => Tuple{Vararg{Dimension}}\n
This is basically dims(x, query)
where the order of the original is kept, unlike dims
where the query tuple determines the order
Also unlike dims
,commondims
always returns a Tuple
, no matter the input. No errors are thrown if dims are absent from either x
or query
.
f
is <:
by default, but can be >:
to sort abstract types by concrete types.
julia> using DimensionalData, .Dimensions\n\njulia> A = DimArray(ones(10, 10, 10), (X, Y, Z));\n\njulia> commondims(A, X)\nX\n\njulia> commondims(A, (X, Z))\nX, Z\n\njulia> commondims(A, Ti)\n()\n
source
# DimensionalData.Dimensions.sortdims
\u2014 Function.
sortdims([f], tosort, order) => Tuple\n
Sort dimensions tosort
by order
. Dimensions in order
but missing from tosort
are replaced with nothing
.
tosort
and order
can be Tuple
s or Vector
s or Dimension or dimension type. Abstract supertypes like TimeDim
can be used in order
.
f
is <:
by default, but can be >:
to sort abstract types by concrete types.
source
# DimensionalData.Dimensions.LookupArrays.basetypeof
\u2014 Function.
basetypeof(x) => Type\n
Get the \"base\" type of an object - the minimum required to define the object without it's fields. By default this is the full UnionAll
for the type. But custom basetypeof
methods can be defined for types with free type parameters.
In DimensionalData this is primariliy used for comparing Dimension
s, where Dim{:x}
is different from Dim{:y}
.
source
# DimensionalData.Dimensions.setdims
\u2014 Function.
setdims(X, newdims) => AbstractArray\nsetdims(::Tuple, newdims) => Tuple{Vararg{Dimension,N}}\n
Replaces the first dim matching <: basetypeof(newdim)
with newdim, and returns a new object or tuple with the dimension updated.
Arguments
x
: any object with a dims
method, a Tuple
of Dimension
or a single Dimension
. newdim
: Tuple or single Dimension
, Type
or Symbol
.
Example
using DimensionalData, DimensionalData.Dimensions, DimensionalData.LookupArrays\nA = ones(X(10), Y(10:10:100))\nB = setdims(A, Y(Categorical('a':'j'; order=ForwardOrdered())))\nlookup(B, Y)\n# output\nCategorical{Char} ForwardOrdered\nwrapping: 'a':1:'j'\n
source
# DimensionalData.Dimensions.dimsmatch
\u2014 Function.
dimsmatch([f], dim, query) => Bool\ndimsmatch([f], dims::Tuple, query::Tuple) => Bool\n
Compare 2 dimensions or Tuple
of Dimension
are of the same base type, or are at least rotations/transformations of the same type.
f
is <:
by default, but can be >:
to match abstract types to concrete types.
source
# DimensionalData.Dimensions.dimstride
\u2014 Function.
dimstride(x, dim) => Int\n
Get the stride of the dimension relative to the other dimensions.
This may or may not be equal to the stride of the related array, although it will be for Array
.
Arguments
x
is any object with a dims
method, or a Tuple
of Dimension
. dim
is a Dimension
, Dimension
type, or and Int
. Using an Int
is not type-stable.
source
# DimensionalData.refdims_title
\u2014 Function.
refdims_title(A::AbstractDimArray)\nrefdims_title(refdims::Tuple)\nrefdims_title(refdim::Dimension)\n
Generate a title string based on reference dimension values.
source
# DimensionalData.rebuild_from_arrays
\u2014 Function.
rebuild_from_arrays(s::AbstractDimStack, das::NamedTuple{<:Any,<:Tuple{Vararg{AbstractDimArray}}}; kw...)\n
Rebuild an AbstractDimStack
from a Tuple
or NamedTuple
of AbstractDimArray
and an existing stack.
Keywords
Keywords are simply the fields of the stack object:
data
dims
refdims
metadata
layerdims
layermetadata
source
"},{"location":"reference/#lookuparrays","title":"LookupArrays","text":"# DimensionalData.Dimensions.LookupArrays
\u2014 Module.
LookupArrays\n
Module for LookupArrays
and [Selector
]s used in DimensionalData.jl
LookupArrays
defines traits and AbstractArray
wrappers that give specific behaviours for a lookup index when indexed with Selector
.
For example, these allow tracking over array order so fast indexing works evne when the array is reversed.
To load LookupArrays types and methods into scope:
using DimensionalData\nusing DimensionalData.LookupArrays\n
source
"},{"location":"reference/#selectors","title":"Selectors","text":"# DimensionalData.Dimensions.LookupArrays.Selector
\u2014 Type.
Selector\n
Abstract supertype for all selectors.
Selectors are wrappers that indicate that passed values are not the array indices, but values to be selected from the dimension index, such as DateTime
objects for a Ti
dimension.
Selectors provided in DimensionalData are:
At
Between
Touches
Near
Where
Contains
source
# DimensionalData.Dimensions.LookupArrays.IntSelector
\u2014 Type.
IntSelector <: Selector\n
Abstract supertype for Selector
s that return a single Int
index.
source
# DimensionalData.Dimensions.LookupArrays.ArraySelector
\u2014 Type.
ArraySelector <: Selector\n
Abstract supertype for Selector
s that return an AbstractArray
.
source
# DimensionalData.Dimensions.LookupArrays.At
\u2014 Type.
At <: IntSelector\n\nAt(x, atol, rtol)\nAt(x; atol=nothing, rtol=nothing)\n
Selector that exactly matches the value on the passed-in dimensions, or throws an error. For ranges and arrays, every intermediate value must match an existing value - not just the end points.
x
can be any value or Vector
of values.
atol
and rtol
are passed to isapprox
. For Number
rtol
will be set to Base.rtoldefault
, otherwise nothing
, and wont be used.
Example
using DimensionalData\n\nA = DimArray([1 2 3; 4 5 6], (X(10:10:20), Y(5:7)))\nA[X(At(20)), Y(At(6))]\n\n# output\n\n5\n
source
# DimensionalData.Dimensions.LookupArrays.Near
\u2014 Type.
Near <: IntSelector\n\nNear(x)\n
Selector that selects the nearest index to x
.
With Points
this is simply the index values nearest to the x
, however with Intervals
it is the interval center nearest to x
. This will be offset from the index value for Start
and End
loci.
Example
using DimensionalData\n\nA = DimArray([1 2 3; 4 5 6], (X(10:10:20), Y(5:7)))\nA[X(Near(23)), Y(Near(5.1))]\n\n# output\n4\n
source
# DimensionalData.Dimensions.LookupArrays.Between
\u2014 Type.
Between <: ArraySelector\n\nBetween(a, b)\n
Depreciated: use a..b
instead of Between(a, b)
. Other Interval
objects from IntervalSets.jl, like `OpenInterval(a, b) will also work, giving the correct open/closed boundaries.
Between
will e removed in furture to avoid clashes with DataFrames.Between
.
Selector that retreive all indices located between 2 values, evaluated with >=
for the lower value, and <
for the upper value. This means the same value will not be counted twice in 2 adjacent Between
selections.
For Intervals
the whole interval must be lie between the values. For Points
the points must fall between the values. Different Sampling
types may give different results with the same input - this is the intended behaviour.
Between
for Irregular
intervals is a little complicated. The interval is the distance between a value and the next (for Start
locus) or previous (for End
locus) value.
For Center
, we take the mid point between two index values as the start and end of each interval. This may or may not make sense for the values in your indes, so use Between
with Irregular
Intervals(Center())
with caution.
Example
using DimensionalData\n\nA = DimArray([1 2 3; 4 5 6], (X(10:10:20), Y(5:7)))\nA[X(Between(15, 25)), Y(Between(4, 6.5))]\n\n# output\n\n1\u00d72 DimArray{Int64,2} with dimensions:\nX Sampled{Int64} 20:10:20 ForwardOrdered Regular Points,\nY Sampled{Int64} 5:6 ForwardOrdered Regular Points\n5 6\n20 4 5\n
source
# DimensionalData.Dimensions.LookupArrays.Touches
\u2014 Type.
Touches <: ArraySelector\n\nTouches(a, b)\n
Selector that retreives all indices touching the closed interval 2 values, for the maximum possible area that could interact with the supplied range.
This can be better than ..
when e.g. subsetting an area to rasterize, as you may wish to include pixels that just touch the area, rather than those that fall within it.
Touches is different to using closed intervals when the lookups also contain intervals - if any of the intervals touch, they are included. With ..
they are discarded unless the whole cell interval falls inside the selector interval.
Example
using DimensionalData\n\nA = DimArray([1 2 3; 4 5 6], (X(10:10:20), Y(5:7)))\nA[X(Touches(15, 25)), Y(Touches(4, 6.5))]\n\n# output\n1\u00d72 DimArray{Int64,2} with dimensions:\nX Sampled{Int64} 20:10:20 ForwardOrdered Regular Points,\nY Sampled{Int64} 5:6 ForwardOrdered Regular Points\n5 6\n20 4 5\n
source
# DimensionalData.Dimensions.LookupArrays.Contains
\u2014 Type.
Contains <: IntSelector\n\nContains(x)\n
Selector that selects the interval the value is contained by. If the interval is not present in the index, an error will be thrown.
Can only be used for Intervals
or Categorical
.
Example
using DimensionalData; const DD = DimensionalData\ndims_ = X(10:10:20; sampling=DD.Intervals(DD.Center())),\nY(5:7; sampling=DD.Intervals(DD.Center()))\nA = DimArray([1 2 3; 4 5 6], dims_)\nA[X(Contains(8)), Y(Contains(6.8))]\n\n# output\n3\n
source
# DimensionalData.Dimensions.LookupArrays.Where
\u2014 Type.
Where <: ArraySelector\n\nWhere(f::Function)\n
Selector that filters a dimension lookup by any function that accepts a single value and returns a Bool
.
Example
using DimensionalData\n\nA = DimArray([1 2 3; 4 5 6], (X(10:10:20), Y(19:21)))\nA[X(Where(x -> x > 15)), Y(Where(x -> x in (19, 21)))]\n\n# output\n\n1\u00d72 DimArray{Int64,2} with dimensions:\nX Sampled{Int64} Int64[20] ForwardOrdered Regular Points,\nY Sampled{Int64} Int64[19, 21] ForwardOrdered Regular Points\n19 21\n20 4 6\n
source
# DimensionalData.Dimensions.LookupArrays.All
\u2014 Type.
All <: Selector\n\nAll(selectors::Selector...)\n
Selector that combines the results of other selectors. The indices used will be the union of all result sorted in ascending order.
Example
using DimensionalData, Unitful\n\ndimz = X(10.0:20:200.0), Ti(1u\"s\":5u\"s\":100u\"s\")\nA = DimArray((1:10) * (1:20)', dimz)\nA[X=All(At(10.0), At(50.0)), Ti=All(1u\"s\"..10u\"s\", 90u\"s\"..100u\"s\")]\n\n# output\n\n2\u00d74 DimArray{Int64,2} with dimensions:\nX Sampled{Float64} Float64[10.0, 50.0] ForwardOrdered Regular Points,\nTi Sampled{Quantity{Int64, \ud835\udc13, Unitful.FreeUnits{(s,), \ud835\udc13, nothing}}} Quantity{Int64, \ud835\udc13, Unitful.FreeUnits{(s,), \ud835\udc13, nothing}}[1 s, 6 s, 91 s, 96 s] ForwardOrdered Regular Points\n1 s 6 s 91 s 96 s\n10.0 1 2 19 20\n50.0 3 6 57 60\n
source
Lookup properties:
# DimensionalData.Dimensions.LookupArrays.bounds
\u2014 Function.
bounds(xs, [dims::Tuple]) => Tuple{Vararg{Tuple{T,T}}}\nbounds(xs::Tuple) => Tuple{Vararg{Tuple{T,T}}}\nbounds(x, dim) => Tuple{T,T}\nbounds(dim::Union{Dimension,LookupArray}) => Tuple{T,T}\n
Return the bounds of all dimensions of an object, of a specific dimension, or of a tuple of dimensions.
If bounds are not known, one or both values may be nothing
.
dims
can be a Dimension
, a dimension type, or a tuple of either.
source
# DimensionalData.Dimensions.LookupArrays.val
\u2014 Function.
val(x)\nval(dims::Tuple) => Tuple\n
Return the contained value of a wrapper object.
dims
can be Dimension
, Dimension
types, or Symbols
for Dim{Symbol}
.
Objects that don't define a val
method are returned unaltered.
source
# DimensionalData.Dimensions.LookupArrays.LookupArray
\u2014 Type.
LookupArray\n
Types defining the behaviour of a lookup index, how it is plotted and how Selector
s like Between
work.
A LookupArray
may be NoLookup
indicating that the index is just the underlying array axis, Categorical
for ordered or unordered categories, or a Sampled
index for Points
or Intervals
.
source
# DimensionalData.Dimensions.LookupArrays.Aligned
\u2014 Type.
Aligned <: LookupArray\n
Abstract supertype for LookupArray
s where the index is aligned with the array axes.
This is by far the most common supertype for LookupArray
.
source
# DimensionalData.Dimensions.LookupArrays.AbstractSampled
\u2014 Type.
AbstractSampled <: Aligned\n
Abstract supertype for LookupArray
s where the index is aligned with the array, and is independent of other dimensions. Sampled
is provided by this package.
AbstractSampled
must have order
, span
and sampling
fields, or a rebuild
method that accpts them as keyword arguments.
source
# DimensionalData.Dimensions.LookupArrays.Sampled
\u2014 Type.
Sampled <: AbstractSampled\n\nSampled(data::AbstractVector, order::Order, span::Span, sampling::Sampling, metadata)\nSampled(; data=AutoIndex(), order=AutoOrder(), span=AutoSpan(), sampling=Points(), metadata=NoMetadata())\n
A concrete implementation of the LookupArray
AbstractSampled
. It can be used to represent Points
or Intervals
.
Sampled
is capable of representing gridded data from a wide range of sources, allowing correct bounds
and Selector
s for points or intervals of regular, irregular, forward and reverse indexes.
On AbstractDimArray
construction, Sampled
lookup is assigned for all lookups of AbstractRange
not assigned to Categorical
.
Arguments
data
: An AbstractVector
of index values, matching the length of the curresponding array axis. order
: Order
) indicating the order of the index, AutoOrder
by default, detected from the order of data
to be ForwardOrdered
, ReverseOrdered
or Unordered
. These can be provided explicitly if they are known and performance is important. span
: indicates the size of intervals or distance between points, and will be set to Regular
for AbstractRange
and Irregular
for AbstractArray
, unless assigned manually. sampling
: is assigned to Points
, unless set to Intervals
manually. Using Intervals
will change the behaviour of bounds
and Selectors
s to take account for the full size of the interval, rather than the point alone. metadata
: a Dict
or Metadata
wrapper that holds any metadata object adding more information about the array axis - useful for extending DimensionalData for specific contexts, like geospatial data in GeoData.jl. By default it is NoMetadata()
.
Example
Create an array with [Interval
] sampling, and Regular
span for a vector with known spacing.
We set the Locus
of the Intervals
to Start
specifying that the index values are for the positions at the start of each interval.
using DimensionalData, DimensionalData.LookupArrays\n\nx = X(Sampled(100:-20:10; sampling=Intervals(Start())))\ny = Y(Sampled([1, 4, 7, 10]; span=Regular(3), sampling=Intervals(Start())))\nA = ones(x, y)\n\n# output\n5\u00d74 DimArray{Float64,2} with dimensions:\nX Sampled{Int64} 100:-20:20 ReverseOrdered Regular Intervals,\nY Sampled{Int64} Int64[1, 4, 7, 10] ForwardOrdered Regular Intervals\n1 4 7 10\n100 1.0 1.0 1.0 1.0\n80 1.0 1.0 1.0 1.0\n60 1.0 1.0 1.0 1.0\n40 1.0 1.0 1.0 1.0\n20 1.0 1.0 1.0 1.0\n
source
# DimensionalData.Dimensions.LookupArrays.AbstractCategorical
\u2014 Type.
AbstractCategorical <: Aligned\n
LookupArray
s where the values are categories.
Categorical
is the provided concrete implementation. but this can easily be extended - all methods are defined for AbstractCategorical
.
All AbstractCategorical
must provide a rebuild
method with data
, order
and metadata
keyword arguments.
source
# DimensionalData.Dimensions.LookupArrays.Categorical
\u2014 Type.
Categorical <: AbstractCategorical\n\nCategorical(o::Order)\nCategorical(; order=Unordered())\n
An LookupArray where the values are categories.
This will be automatically assigned if the index contains AbstractString
, Symbol
or Char
. Otherwise it can be assigned manually.
Order
will be determined automatically where possible.
Arguments
data
: An AbstractVector
of index values, matching the length of the curresponding array axis. order
: Order
) indicating the order of the index, AutoOrder
by default, detected from the order of data
to be ForwardOrdered
, ReverseOrdered
or Unordered
. Can be provided if this is known and performance is important. metadata
: a Dict
or Metadata
wrapper that holds any metadata object adding more information about the array axis - useful for extending DimensionalData for specific contexts, like geospatial data in GeoData.jl. By default it is NoMetadata()
.
Example
Create an array with [Interval
] sampling.
using DimensionalData\n\nds = X([\"one\", \"two\", \"three\"]), Y([:a, :b, :c, :d])\nA = DimArray(rand(3, 4), ds)\nDimensions.lookup(A)\n\n# output\n\nCategorical{String} String[\"one\", \"two\", \"three\"] Unordered,\nCategorical{Symbol} Symbol[:a, :b, :c, :d] ForwardOrdered\n
source
# DimensionalData.Dimensions.LookupArrays.Unaligned
\u2014 Type.
Unaligned <: LookupArray\n
Abstract supertype for LookupArray
where the index is not aligned to the grid.
Indexing an Unaligned
with Selector
s must provide all other Unaligned
dimensions.
source
# DimensionalData.Dimensions.LookupArrays.Transformed
\u2014 Type.
Transformed <: Unaligned\n\nTransformed(f, dim::Dimension; metadata=NoMetadata())\n
LookupArray
that uses an affine transformation to convert dimensions from dims(lookup)
to dims(array)
. This can be useful when the dimensions are e.g. rotated from a more commonly used axis.
Any function can be used to do the transformation, but transformations from CoordinateTransformations.jl may be useful.
Arguments
f
: transformation function dim
: a dimension to transform to.
Keyword Arguments
metdata
:
Example
using DimensionalData, DimensionalData.LookupArrays, CoordinateTransformations\n\nm = LinearMap([0.5 0.0; 0.0 0.5])\nA = [1 2 3 4\n5 6 7 8\n9 10 11 12];\nda = DimArray(A, (t1=Transformed(m, X), t2=Transformed(m, Y)))\n\nda[X(At(6)), Y(At(2))]\n\n# output\n9\n
source
# DimensionalData.Dimensions.MergedLookup
\u2014 Type.
MergedLookup <: LookupArray\n\nMergedLookup(data, dims; [metadata])\n
A LookupArray
that holds multiple combined dimensions.
MergedLookup
can be indexed with Selector
s like At
, Between
, and Where
although Near
has undefined meaning.
Arguments
data
: A Vector
of Tuple
. dims
: A Tuple
of Dimension
indicating the dimensions in the tuples in data
.
Keywords
metadata
: a Dict
or Metadata
object to attach dimension metadata.
source
# DimensionalData.Dimensions.LookupArrays.NoLookup
\u2014 Type.
NoLookup <: LookupArray\n\nNoLookup()\n
A LookupArray
that is identical to the array axis. Selector
s can't be used on this lookup.
Example
Defining a DimArray
without passing an index to the dimensions, it will be assigned NoLookup
:
using DimensionalData\n\nA = DimArray(rand(3, 3), (X, Y))\nDimensions.lookup(A)\n\n# output\n\nNoLookup, NoLookup\n
Which is identical to:
using .LookupArrays\nA = DimArray(rand(3, 3), (X(NoLookup()), Y(NoLookup())))\nDimensions.lookup(A)\n\n# output\n\nNoLookup, NoLookup\n
source
# DimensionalData.Dimensions.LookupArrays.AutoLookup
\u2014 Type.
AutoLookup <: LookupArray\n\nAutoLookup()\nAutoLookup(index=AutoIndex(); kw...)\n
Automatic LookupArray
, the default lookup. It will be converted automatically to another LookupArray
when it is possible to detect it from the index.
Keywords will be used in the detected LookupArray
constructor.
source
# DimensionalData.Dimensions.LookupArrays.AutoIndex
\u2014 Type.
AutoIndex\n
Detect a LookupArray
index from the context. This is used in NoLookup
to simply use the array axis as the index when the array is constructed, and in set
to change the LookupArray
type without changing the index values.
source
"},{"location":"reference/#metadata","title":"Metadata","text":"# DimensionalData.Dimensions.LookupArrays.AbstractMetadata
\u2014 Type.
AbstractMetadata{X,T}\n
Abstract supertype for all metadata wrappers.
Metadata wrappers allow tracking the contents and origin of metadata. This can facilitate conversion between metadata types (for saving a file to a differenet format) or simply saving data back to the same file type with identical metadata.
Using a wrapper instead of Dict
or NamedTuple
also lets us pass metadata objects to set
without ambiguity about where to put them.
source
# DimensionalData.Dimensions.LookupArrays.Metadata
\u2014 Type.
Metadata <: AbstractMetadata\n\nMetadata{X}(val::Union{Dict,NamedTuple})\nMetadata{X}(pairs::Pair...) => Metadata{Dict}\nMetadata{X}(; kw...) => Metadata{NamedTuple}\n
General Metadata
object. The X
type parameter categorises the metadata for method dispatch, if required.
source
# DimensionalData.Dimensions.LookupArrays.NoMetadata
\u2014 Type.
NoMetadata <: AbstractMetadata\n\nNoMetadata()\n
Indicates an object has no metadata. But unlike using nothing
, get
, keys
and haskey
will still work on it, get
always returning the fallback argument. keys
returns ()
while haskey
always returns false
.
source
"},{"location":"reference/#lookuparray-traits","title":"LookupArray traits","text":"# DimensionalData.Dimensions.LookupArrays.LookupArrayTrait
\u2014 Type.
LookupArrayTrait\n
Abstract supertype of all traits of a LookupArray
.
These modify the behaviour of the lookup index.
The term \"Trait\" is used loosely - these may be fields of an object of traits hard-coded to specific types.
source
"},{"location":"reference/#order","title":"Order","text":"# DimensionalData.Dimensions.LookupArrays.Order
\u2014 Type.
Order <: LookupArrayTrait\n
Traits for the order of a LookupArray
. These determine how searchsorted
finds values in the index, and how objects are plotted.
source
# DimensionalData.Dimensions.LookupArrays.Ordered
\u2014 Type.
Ordered <: Order\n
Supertype for the order of an ordered LookupArray
, including ForwardOrdered
and ReverseOrdered
.
source
# DimensionalData.Dimensions.LookupArrays.ForwardOrdered
\u2014 Type.
ForwardOrdered <: Ordered\n\nForwardOrdered()\n
Indicates that the LookupArray
index is in the normal forward order.
source
# DimensionalData.Dimensions.LookupArrays.ReverseOrdered
\u2014 Type.
ReverseOrdered <: Ordered\n\nReverseOrdered()\n
Indicates that the LookupArray
index is in the reverse order.
source
# DimensionalData.Dimensions.LookupArrays.Unordered
\u2014 Type.
Unordered <: Order\n\nUnordered()\n
Indicates that LookupArray
is unordered.
This means the index cannot be searched with searchsortedfirst
or similar optimised methods - instead it will use findfirst
.
source
# DimensionalData.Dimensions.LookupArrays.AutoOrder
\u2014 Type.
AutoOrder <: Order\n\nAutoOrder()\n
Specifies that the Order
of a LookupArray
will be found automatically where possible.
source
"},{"location":"reference/#span","title":"Span","text":"# DimensionalData.Dimensions.LookupArrays.Span
\u2014 Type.
Span <: LookupArrayTrait\n
Defines the type of span used in a Sampling
index. These are Regular
or Irregular
.
source
# DimensionalData.Dimensions.LookupArrays.Regular
\u2014 Type.
Regular <: Span\n\nRegular(step=AutoStep())\n
Points
or Intervals
that have a fixed, regular step.
source
# DimensionalData.Dimensions.LookupArrays.Irregular
\u2014 Type.
Irregular <: Span\n\nIrregular(bounds::Tuple)\nIrregular(lowerbound, upperbound)\n
Points
or Intervals
that have an Irrigular
step size. To enable bounds tracking and accuract selectors, the starting bounds are provided as a 2 tuple, or 2 arguments. (nothing, nothing)
is acceptable input, the bounds will be guessed from the index, but may be innaccurate.
source
# DimensionalData.Dimensions.LookupArrays.Explicit
\u2014 Type.
Explicit(bounds::AbstractMatix)\n
Intervals where the span is explicitly listed for every interval.
This uses a matrix where with length 2 columns for each index value, holding the lower and upper bounds for that specific index.
source
# DimensionalData.Dimensions.LookupArrays.AutoSpan
\u2014 Type.
AutoSpan <: Span\n\nAutoSpan()\n
The span will be guessed and replaced in format
or set
.
source
"},{"location":"reference/#sampling","title":"Sampling","text":"# DimensionalData.Dimensions.LookupArrays.Sampling
\u2014 Type.
Sampling <: LookupArrayTrait\n
Indicates the sampling method used by the index: Points
or Intervals
.
source
# DimensionalData.Dimensions.LookupArrays.Points
\u2014 Type.
Points <: Sampling\n\nPoints()\n
Sampling
lookup where single samples at exact points.
These are always plotted at the center of array cells.
source
# DimensionalData.Dimensions.LookupArrays.Intervals
\u2014 Type.
Intervals <: Sampling\n\nIntervals(locus::Locus)\n
Sampling
specifying that sampled values are the mean (or similar) value over an interval, rather than at one specific point.
Intervals require a Locus
of Start
, Center
or End
to define the location in the interval that the index values refer to.
source
"},{"location":"reference/#loci","title":"Loci","text":"# DimensionalData.Dimensions.LookupArrays.Locus
\u2014 Type.
Locus <: LookupArrayTrait
Abstract supertype of types that indicate the position of index values where they represent Intervals
.
These allow for values array cells to align with the Start
, Center
, or End
of values in the lookup index.
This means they can be plotted with correct axis markers, and allows automatic converrsions to between formats with different standards (such as NetCDF and GeoTiff).
source
# DimensionalData.Dimensions.LookupArrays.Center
\u2014 Type.
Center <: Locus\n\nCenter()\n
Indicates a lookup value is for the center of its corresponding array cell.
source
# DimensionalData.Dimensions.LookupArrays.Start
\u2014 Type.
Start <: Locus\n\nStart()\n
Indicates a lookup value is for the start of its corresponding array cell, in the direction of the lookup index order.
source
# DimensionalData.Dimensions.LookupArrays.End
\u2014 Type.
End <: Locus\n\nEnd()\n
Indicates a lookup value is for the end of its corresponding array cell, in the direction of the lookup index order.
source
# DimensionalData.Dimensions.LookupArrays.AutoLocus
\u2014 Type.
AutoLocus <: Locus\n\nAutoLocus()\n
Indicates a interval where the index position is not yet known. This will be filled with a default value on object construction.
source
"},{"location":"reference/#lookuparrays-methods","title":"LookupArrays methods","text":"# DimensionalData.Dimensions.LookupArrays.hasselection
\u2014 Function.
hasselection(x, selector) => Bool\nhasselection(x, selectors::Tuple) => Bool\n
Check if indexing into x with selectors
can be performed, where x is some object with a dims
method, and selectors
is a Selector
or Dimension
or a tuple of either.
source
# DimensionalData.Dimensions.LookupArrays.shiftlocus
\u2014 Function.
shiftlocus(locus::Locus, x)\n
Shift the index of x
from the current locus to the new locus.
We only shift Sampled
, Regular
or Explicit
, Intervals
.
source
# DimensionalData.Dimensions.LookupArrays.sampling
\u2014 Function.
sampling(x, [dims::Tuple]) => Tuple\nsampling(x, dim) => Sampling\nsampling(xs::Tuple) => Tuple{Vararg{Sampling}}\nsampling(x:Union{Dimension,LookupArray}) => Sampling\n
Return the Sampling
for each dimension.
Second argument dims
can be Dimension
s, Dimension
types, or Symbols
for Dim{Symbol}
.
source
# DimensionalData.Dimensions.LookupArrays.span
\u2014 Function.
span(x, [dims::Tuple]) => Tuple\nspan(x, dim) => Span\nspan(xs::Tuple) => Tuple{Vararg{Span,N}}\nspan(x::Union{Dimension,LookupArray}) => Span\n
Return the Span
for each dimension.
Second argument dims
can be Dimension
s, Dimension
types, or Symbols
for Dim{Symbol}
.
source
# DimensionalData.Dimensions.LookupArrays.order
\u2014 Function.
order(x, [dims::Tuple]) => Tuple\norder(xs::Tuple) => Tuple\norder(x::Union{Dimension,LookupArray}) => Order\n
Return the Ordering
of the dimension index for each dimension: ForwardOrdered
, ReverseOrdered
, or Unordered
Second argument dims
can be Dimension
s, Dimension
types, or Symbols
for Dim{Symbol}
.
source
# DimensionalData.Dimensions.LookupArrays.index
\u2014 Function.
index(x) => Tuple{Vararg{AbstractArray}}\nindex(x, dims::Tuple) => Tuple{Vararg{AbstractArray}}\nindex(dims::Tuple) => Tuple{Vararg{AbstractArray}}}\nindex(x, dim) => AbstractArray\nindex(dim::Dimension) => AbstractArray\n
Return the contained index of a Dimension
.
Only valid when a Dimension
contains an AbstractArray
or a Val tuple like Val{(:a, :b)}()
. The Val
is unwrapped to return just the Tuple
dims
can be a Dimension
, or a tuple of Dimension
.
source
# DimensionalData.Dimensions.LookupArrays.locus
\u2014 Function.
locus(x, [dims::Tuple]) => Tuple\nlocus(x, dim) => Locus\nlocus(xs::Tuple) => Tuple{Vararg{Locus,N}}\nlocus(x::Union{Dimension,LookupArray}) => Locus\n
Return the Locus
for each dimension.
Second argument dims
can be Dimension
s, Dimension
types, or Symbols
for Dim{Symbol}
.
source
# DimensionalData.Dimensions.LookupArrays.units
\u2014 Function.
units(x) => Union{Nothing,Any}\nunits(xs:Tuple) => Tuple\nunit(A::AbstractDimArray, dims::Tuple) => Tuple\nunit(A::AbstractDimArray, dim) => Union{Nothing,Any}\n
Get the units of an array or Dimension
, or a tuple of of either.
Units do not have a set field, and may or may not be included in metadata
. This method is to facilitate use in labels and plots when units are available, not a guarantee that they will be. If not available, nothing
is returned.
Second argument dims
can be Dimension
s, Dimension
types, or Symbols
for Dim{Symbol}
.
source
"},{"location":"reference/#name","title":"Name","text":"# DimensionalData.AbstractName
\u2014 Type.
AbstractName\n
Abstract supertype for name wrappers.
source
# DimensionalData.Name
\u2014 Type.
Name <: AbstractName\n\nName(name::Union{Symbol,Name) => Name\nName(name::NoName) => NoName\n
Name wrapper. This lets arrays keep symbol names when the array wrapper neeeds to be `isbits, like for use on GPUs. It makes the name a property of the type. It's not necessary to use in normal use, a symbol is probably easier.
source
# DimensionalData.NoName
\u2014 Type.
NoName <: AbstractName\n\nNoName()\n
NoName specifies an array is not named, and is the default name
value for all AAbstractDimArray
s.
source
"},{"location":"crash/generated/course/course/","title":"Crash course","text":"using DimensionalData\n
"},{"location":"crash/generated/course/course/#dimensions-and-dimarrays","title":"Dimensions and DimArrays","text":"The core type of DimensionalData.jl is the Dimension
and the types that inherit from it, such as Ti
, X
, Y
, Z
, the generic Dim{:x}
, or others that you define manually using the @dim
macro.
Dimension
s are primarily used in DimArray
, other AbstractDimArray
.
We can use dimensions without a value index - these simply label the axis. A DimArray
with labelled dimensions is constructed by:
using DimensionalData\nA = rand(X(5), Y(5))\n
5\u00d75 DimArray{Float64,2} with dimensions: X, Y\n 0.610652 0.58118 0.905337 0.837697 0.767474\n 0.104909 0.799412 0.484191 0.36956 0.164103\n 0.943738 0.181849 0.835808 0.00869301 0.504133\n 0.182849 0.641531 0.94619 0.750461 0.0331413\n 0.0402291 0.991976 0.00437949 0.458619 0.536827\n
get value
A[Y(1), X(2)]\n
0.10490910803361231\n
As shown above, Dimension
s can be used to construct arrays in rand
, ones
, zeros
and fill
with either a range for a lookup index or a number for the dimension length.
Or we can use the Dim{X}
dims by using Symbol
s, and indexing with keywords:
A = DimArray(rand(5, 5), (:a, :b))\n
5\u00d75 DimArray{Float64,2} with dimensions: Dim{:a}, Dim{:b}\n 0.313941 0.785278 0.57812 0.866912 0.0878701\n 0.361067 0.969103 0.567315 0.128225 0.802768\n 0.387414 0.642912 0.0187058 0.96045 0.115424\n 0.896839 0.9305 0.29628 0.916632 0.328504\n 0.126352 0.634827 0.627215 0.395971 0.76365\n
get value
A[a=3, b=5]\n
0.11542371626636982\n
Often, we want to provide a lookup index for the dimension:
using Dates\nt = DateTime(2001):Month(1):DateTime(2001,12)\nx = 10:10:100\nA = rand(X(x), Ti(t))\n
10\u00d712 DimArray{Float64,2} with dimensions: \n X Sampled{Int64} 10:10:100 ForwardOrdered Regular Points,\n Ti Sampled{DateTime} DateTime(\"2001-01-01T00:00:00\"):Month(1):DateTime(\"2001-12-01T00:00:00\") ForwardOrdered Regular Points\n 2001-01-01T00:00:00 \u2026 2001-12-01T00:00:00\n 10 0.616383 0.377344\n 20 0.503684 0.00643561\n 30 0.45995 0.902946\n 40 0.10482 0.757038\n 50 0.59612 \u2026 0.56312\n 60 0.816959 0.721416\n 70 0.846454 0.0334377\n 80 0.230465 0.629093\n 90 0.344545 0.0961886\n 100 0.62133 \u2026 0.96555\n
Here both X
and Ti
are dimensions from DimensionalData
. The currently exported dimensions are X, Y, Z, Ti
(Ti
is shortening of Time
).
The length of each dimension index has to match the size of the corresponding array axis.
This can also be done with Symbol
, using Dim{X}
:
A2 = DimArray(rand(12, 10), (time=t, distance=x))\n
12\u00d710 DimArray{Float64,2} with dimensions: \n Dim{:time} Sampled{DateTime} DateTime(\"2001-01-01T00:00:00\"):Month(1):DateTime(\"2001-12-01T00:00:00\") ForwardOrdered Regular Points,\n Dim{:distance} Sampled{Int64} 10:10:100 ForwardOrdered Regular Points\n \u2026 80 90 100\n 2001-01-01T00:00:00 0.314094 0.876493 0.488724\n 2001-02-01T00:00:00 0.0102914 0.686881 0.0442961\n 2001-03-01T00:00:00 0.113609 0.718153 0.655143\n 2001-04-01T00:00:00 0.130198 0.557537 0.21255\n 2001-05-01T00:00:00 \u2026 0.806614 0.458922 0.241154\n 2001-06-01T00:00:00 0.268379 0.994217 0.153776\n 2001-07-01T00:00:00 0.870931 0.651182 0.683836\n 2001-08-01T00:00:00 0.0860832 0.377475 0.165645\n 2001-09-01T00:00:00 0.912859 0.768381 0.926545\n 2001-10-01T00:00:00 \u2026 0.748863 0.259785 0.296125\n 2001-11-01T00:00:00 0.0239111 0.511522 0.596048\n 2001-12-01T00:00:00 0.957322 0.299066 0.881629\n
Symbols can be more convenient to use than defining custom dims with @dim
, but have some downsides. They don't inherit from a specific Dimension
type, so plots will not know what axis to put them on. They also cannot use the basic constructor methods like rand
or zeros
, as we cannot dispatch on Symbol
for Base methods without \"type-piracy\".
"},{"location":"crash/generated/course/course/#indexing-the-array-by-name-and-index","title":"Indexing the array by name and index","text":"Dimensions can be used to index the array by name, without having to worry about the order of the dimensions.
The simplest case is to select a dimension by index. Let's say every 2nd point of the Ti
dimension and every 3rd point of the X
dimension. This is done with the simple Ti(range)
syntax like so:
A[X(1:3:11), Ti(1:2:11)]\n
4\u00d76 DimArray{Float64,2} with dimensions: \n X Sampled{Int64} 10:30:100 ForwardOrdered Regular Points,\n Ti Sampled{DateTime} DateTime(\"2001-01-01T00:00:00\"):Month(2):DateTime(\"2001-11-01T00:00:00\") ForwardOrdered Regular Points\n 2001-01-01T00:00:00 \u2026 2001-11-01T00:00:00\n 10 0.616383 0.087949\n 40 0.10482 0.109812\n 70 0.846454 0.612431\n 100 0.62133 0.0964429\n
When specifying only one dimension, all elements of the other dimensions are assumed to be included:
A[X(1:3:10)]\n
4\u00d712 DimArray{Float64,2} with dimensions: \n X Sampled{Int64} 10:30:100 ForwardOrdered Regular Points,\n Ti Sampled{DateTime} DateTime(\"2001-01-01T00:00:00\"):Month(1):DateTime(\"2001-12-01T00:00:00\") ForwardOrdered Regular Points\n 2001-01-01T00:00:00 \u2026 2001-12-01T00:00:00\n 10 0.616383 0.377344\n 40 0.10482 0.757038\n 70 0.846454 0.0334377\n 100 0.62133 0.96555\n
Indexing
Indexing AbstractDimArray
s works with getindex
, setindex!
and view
. The result is still an AbstracDimArray
, unless using all single Int
or Selector
s that resolve to Int
.
Dimension
s can be used to construct arrays in rand
, ones
, zeros
and fill
with either a range for a lookup index or a number for the dimension length.
using DimensionalData\nA1 = ones(X(1:40), Y(50))\n
40\u00d750 DimArray{Float64,2} with dimensions: \n X Sampled{Int64} 1:40 ForwardOrdered Regular Points,\n Y\n 1 1.0 1.0 1.0 1.0 1.0 1.0 1.0 \u2026 1.0 1.0 1.0 1.0 1.0 1.0 1.0\n 2 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0\n 3 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0\n 4 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0\n 5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0\n 6 1.0 1.0 1.0 1.0 1.0 1.0 1.0 \u2026 1.0 1.0 1.0 1.0 1.0 1.0 1.0\n \u22ee \u22ee \u22f1 \u22ee \u22ee \n 35 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0\n 36 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0\n 37 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0\n 38 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0\n 39 1.0 1.0 1.0 1.0 1.0 1.0 1.0 \u2026 1.0 1.0 1.0 1.0 1.0 1.0 1.0\n 40 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0\n
We can also use dim wrappers for indexing, so that the dimension order in the underlying array does not need to be known:
A1[Y(1), X(1:10)]\n
10-element DimArray{Float64,1} with dimensions: \n X Sampled{Int64} 1:10 ForwardOrdered Regular Points\nand reference dimensions: Y\n 1 1.0\n 2 1.0\n 3 1.0\n 4 1.0\n 5 1.0\n 6 1.0\n 7 1.0\n 8 1.0\n 9 1.0\n 10 1.0\n
"},{"location":"crash/generated/course/course/#indexing-performance","title":"Indexing Performance","text":"Indexing with Dimension
has no runtime cost:
A2 = ones(X(3), Y(3))\n
3\u00d73 DimArray{Float64,2} with dimensions: X, Y\n 1.0 1.0 1.0\n 1.0 1.0 1.0\n 1.0 1.0 1.0\n
time ?
using BenchmarkTools\n\nprintln(@btime $A2[X(1), Y(2)])\n
47.315 ns (0 allocations: 0 bytes)\n1.0\n
and
println(@btime parent($A2)[1, 2])\n
4.500 ns (0 allocations: 0 bytes)\n1.0\n
"},{"location":"crash/generated/course/course/#specifying-dims-keyword-arguments-with-dimension","title":"Specifying dims
keyword arguments with Dimension
","text":"In many Julia functions like size
or sum
, you can specify the dimension along which to perform the operation as an Int
. It is also possible to do this using Dimension
types with AbstractDimArray
:
A3 = rand(X(3), Y(4), Ti(5));\nsum(A3; dims=Ti)\n
3\u00d74\u00d71 DimArray{Float64,3} with dimensions: X, Y, Ti\n[:, :, 1]\n 2.72419 2.49783 2.37618 1.85908\n 3.45302 2.57787 2.76568 3.36199\n 3.67329 2.06017 1.90024 2.47226\n
This also works in methods from Statistics
:
using Statistics\nmean(A3; dims=Ti)\n
3\u00d74\u00d71 DimArray{Float64,3} with dimensions: X, Y, Ti\n[:, :, 1]\n 0.544837 0.499567 0.475236 0.371816\n 0.690604 0.515575 0.553137 0.672398\n 0.734658 0.412034 0.380049 0.494452\n
"},{"location":"crash/generated/course/course/#methods-where-dims-dim-types-or-symbols-can-be-used-to-indicate-the-array-dimension","title":"Methods where dims, dim types, or Symbol
s can be used to indicate the array dimension:","text":" size
, axes
, firstindex
, lastindex
cat
, reverse
, dropdims
reduce
, mapreduce
sum
, prod
, maximum
, minimum
, mean
, median
, extrema
, std
, var
, cor
, cov
permutedims
, adjoint
, transpose
, Transpose
mapslices
, eachslice
"},{"location":"crash/generated/course/course/#lookuparrays-and-selectors","title":"LookupArrays and Selectors","text":"Indexing by value in DimensionalData
is done with Selectors. IntervalSets.jl is now used for selecting ranges of values (formerly Between
).
Selector Description At(x)
get the index exactly matching the passed in value(s) Near(x)
get the closest index to the passed in value(s) Contains(x)
get indices where the value x falls within an interval Where(f)
filter the array axis by a function of the dimension index values. [Not(x)
] get all indices not selected by x
, which can be another selector. [a..b
] get all indices between two values, inclusively. [OpenInterval(a, b)
] get all indices between a
and b
, exclusively. [Interval{A,B}(a, b)
] get all indices between a
and b
, as :closed
or :open
. Selectors find indices in the LookupArray
, for each dimension. Here we use an Interval
to select a range between integers and DateTime
:
A[X(12..35), Ti(Date(2001, 5)..Date(2001, 7))]\n
2\u00d73 DimArray{Float64,2} with dimensions: \n X Sampled{Int64} 20:10:30 ForwardOrdered Regular Points,\n Ti Sampled{DateTime} DateTime(\"2001-05-01T00:00:00\"):Month(1):DateTime(\"2001-07-01T00:00:00\") ForwardOrdered Regular Points\n 2001-05-01T00:00:00 \u2026 2001-07-01T00:00:00\n 20 0.143078 0.606918\n 30 0.894306 0.140967\n
To select intervals in DimArrays (e.g. A2
) you need to specify dimname=a .. b
:
A2[distance=12 .. 35, time=Date(2001, 5) .. Date(2001, 7)]\n
3\u00d73 DimArray{Float64,2} with dimensions: X, Y\n 1.0 1.0 1.0\n 1.0 1.0 1.0\n 1.0 1.0 1.0\n
Selectors can be used in getindex
, setindex!
and view
to select indices matching the passed in value(s)
We can use selectors inside dim wrappers, here selecting values from DateTime
and Int
:
using Dates\ntimespan = DateTime(2001,1):Month(1):DateTime(2001,12)\nA4 = rand(Ti(timespan), X(10:10:100))\nA4[X(Near(35)), Ti(At(DateTime(2001,5)))]\n
0.06402993024635817\n
Without dim wrappers selectors must be in the right order, and specify all axes:
using Unitful\nA5 = rand(Y((1:10:100)u\"m\"), Ti((1:5:100)u\"s\"));\nA5[10.5u\"m\" .. 50.5u\"m\", Near(23u\"s\")]\n
4-element DimArray{Float64,1} with dimensions: \n Y Sampled{Quantity{Int64, \ud835\udc0b, Unitful.FreeUnits{(m,), \ud835\udc0b, nothing}}} (11:10:41) m ForwardOrdered Regular Points\nand reference dimensions: \n Ti Sampled{Quantity{Int64, \ud835\udc13, Unitful.FreeUnits{(s,), \ud835\udc13, nothing}}} (21:5:21) s ForwardOrdered Regular Points\n 11 m 0.531562\n 21 m 0.0480949\n 31 m 0.83992\n 41 m 0.847592\n
We can also use Linear indices as in standard Array
:
A5[1:5]\n
5-element Vector{Float64}:\n 0.48518270694426\n 0.009806663404159255\n 0.9956056644602331\n 0.8790389156104539\n 0.8772182200262983\n
But unless the DimArray
is one dimensional, this will return a regular Array
. It is not possible to keep the LookupArray
or even Dimension
s after linear indexing is used.
"},{"location":"crash/generated/course/course/#lookuparrays-and-traits","title":"LookupArrays and traits","text":"Using a regular range or Vector
as a lookup index has a number of downsides. We cannot use searchsorted
for fast searches without knowing the order of the array, and this is slow to compute at runtime. It also means reverse
or rotations cannot be used while keeping the DimArray
wrapper.
Step sizes are also a problem. Some ranges like LinRange
lose their step size with a length of 1
. Often, instead of a range, multi-dimensional data formats provide a Vector
of evenly spaced values for a lookup, with a step size specified separately. Converting to a range introduces floating point errors that means points may not be selected with At
without setting tolerances.
This means using a lookup wrapper with traits is more generally robust and versatile than simply using a range or vector. DimensionalData provides types for specifying details about the dimension index, in the LookupArrays
sub-module:
using DimensionalData\nusing .LookupArrays\n
The main LookupArray
are :
Sampled
Categorical
, NoLookup
Each comes with specific traits that are either fixed or variable, depending on the contained index. These enable optimisations with Selector
s, and modified behaviours, such as:
- Selection of
Intervals
or Points
, which will give slightly
different results for selectors like ..
- as whole intervals are selected, and have different bounds
values.
- Tracking of lookup order. A reverse order is labelled
ReverseOrdered
and
will still work with searchsorted
, and for plots to always be the right way up when either the index or the array is backwards. Reversing a DimArray
will reverse the LookupArray
for that dimension, swapping ReverseOrdered
to ForwardOrdered
.
-
Sampled
Intervals
can have index located at a Locus
of:
-
Start
,
Center
End
Which specifies the point of the interval represented in the index, to match different data standards, e.g. GeoTIFF (Start
) and NetCDF (Center
).
- A
Span
specifies the gap between Points
or the size of
Intervals
. This may be:
Regular
, in the case of a range and equally spaced vector, Irregular
for unequally spaced vectors Explicit
for the case where all interval start and end points are specified explicitly - as is common in the NetCDF standard.
These traits all for subtypes of Aligned
.
Unaligned
also exists to handle dimensions with an index that is rotated or otherwise transformed in relation to the underlying array, such as Transformed
.
"},{"location":"crash/generated/course/course/#lookuparray-detection","title":"LookupArray detection","text":"Aligned
types will be detected automatically if not specified - which usually isn't required.
- An empty
Dimension
or a Type
or Symbol
will be assigned NoLookup
- this behaves as a simple named dimension without a lookup index. - A
Dimension
containing and index of String
, Char
, Symbol
or mixed types will be given the Categorical
mode, - A range will be assigned
Sampled
, defaulting to Regular
, Points
- Other
AbstractVector
will be assigned Sampled
Irregular
Points
.
In all cases the Order
of ForwardOrdered
or ReverseOrdered
will be be detected, otherwise Unordered
for an unsorted Array
.
See the LookupArray
API docs for more detail.
"},{"location":"crash/generated/course/course/#referenced-dimensions","title":"Referenced dimensions","text":"The reference dimensions record the previous dimensions that an array was selected from. These can be use for plot labelling, and tracking array changes so that cat
can reconstruct the lookup array from previous dimensions that have been sliced.
"},{"location":"crash/generated/course/course/#warnings","title":"Warnings","text":"Indexing with unordered or reverse-ordered arrays has undefined behaviour. It will trash the dimension index, break searchsorted
and nothing will make sense any more. So do it at you own risk.
However, indexing with sorted vectors of Int
can be useful, so it's allowed. But it may do strange things to interval sizes for Intervals
that are not Explicit
.
This selects the first 5 entries of the underlying array. In the case that A
has only one dimension, it will be retained. Multidimensional AbstracDimArray
indexed this way will return a regular array.
This page was generated using Literate.jl.
"}]}
\ No newline at end of file
+{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Home","text":""},{"location":"#dimensionaldata","title":"DimensionalData","text":"DimensionalData.jl provides tools and abstractions for working with datasets that have named dimensions, and optionally a lookup index.
DimensionalData is a pluggable, generalised version of AxisArrays.jl with a cleaner syntax, and additional functionality found in NamedDims.jl. It has similar goals to pythons xarray, and is primarily written for use with spatial data in Rasters.jl.
"},{"location":"#goals","title":"Goals","text":" - Clean, readable syntax. Minimise required parentheses, minimise of exported
- Zero-cost dimensional indexing
a[Y(4), X(5)]
of a single value. methods, and instead extend Base methods whenever possible. - Plotting is easy: data should plot sensibly and correctly with useful labels, by default.
- Least surprise: everything works the same as in Base, but with named dims. If a method accepts numeric indices or
dims=X
in base, you should be able to use DimensionalData.jl dims. - Minimal interface: implementing a dimension-aware type should be easy.
- Maximum extensibility: always use method dispatch. Regular types over special syntax. Recursion over @generated. Always dispatch on abstract types.
- Type stability: dimensional methods should be type stable more often than Base methods
- Functional style: structs are always rebuilt, and other than the array data, fields are not mutated in place.
"},{"location":"#for-package-developers","title":"For package developers","text":""},{"location":"#data-types-and-the-interface","title":"Data types and the interface","text":"DimensionalData.jl provides the concrete DimArray
type. But its behaviours are intended to be easily applied to other array types.
more The main requirement for extending DimensionalData.jl is to define a dims
method that returns a Tuple
of Dimension
that matches the dimension order and axis values of your data. Define rebuild
and base methods for similar
and parent
if you want the metadata to persist through transformations (see the DimArray
and AbstractDimArray
types). A refdims
method returns the lost dimensions of a previous transformation, passed in to the rebuild
method. refdims
can be discarded, the main loss being plot labels and ability to reconstruct dimensions in cat
.
Inheriting from AbstractDimArray
in this way will give nearly all the functionality of using DimArray
.
"},{"location":"#lookuparrays-and-dimensions","title":"LookupArrays and Dimensions","text":"Sub modules LookupArrays
and Dimensions
define the behviour of dimensions and their lookup index.
LookupArrays
and Dimensions
"},{"location":"reference/","title":"Reference","text":""},{"location":"reference/#api","title":"API","text":""},{"location":"reference/#arrays","title":"Arrays","text":"# DimensionalData.AbstractDimArray
\u2014 Type.
AbstractDimArray <: AbstractArray\n
Abstract supertype for all \"dim\" arrays.
These arrays return a Tuple
of Dimension
from a dims
method, and can be rebuilt using rebuild
.
parent
must return the source array.
They should have metadata
, name
and refdims
methods, although these are optional.
A rebuild
method for AbstractDimArray
must accept data
, dims
, refdims
, name
, metadata
arguments.
Indexing AbstractDimArray
with non-range AbstractArray
has undefined effects on the Dimension
index. Use forward-ordered arrays only\"
source
# DimensionalData.DimArray
\u2014 Type.
DimArray <: AbstractDimArray\n\nDimArray(data, dims, refdims, name, metadata)\nDimArray(data, dims::Tuple; refdims=(), name=NoName(), metadata=NoMetadata())\n
The main concrete subtype of AbstractDimArray
.
DimArray
maintains and updates its Dimension
s through transformations and moves dimensions to reference dimension refdims
after reducing operations (like e.g. mean
).
Arguments
data
: An AbstractArray
. dims
: A Tuple
of Dimension
name
: A string name for the array. Shows in plots and tables. refdims
: refence dimensions. Usually set programmatically to track past slices and reductions of dimension for labelling and reconstruction. metadata
: Dict
or Metadata
object, or NoMetadata()
Indexing can be done with all regular indices, or with Dimension
s and/or Selector
s.
Indexing AbstractDimArray
with non-range AbstractArray
has undefined effects on the Dimension
index. Use forward-ordered arrays only\"
Example:
using Dates, DimensionalData\n\nti = (Ti(DateTime(2001):Month(1):DateTime(2001,12)),\nx = X(10:10:100))\nA = DimArray(rand(12,10), (ti, x), \"example\")\n\njulia> A[X(Near([12, 35])), Ti(At(DateTime(2001,5)))];\n\njulia> A[Near(DateTime(2001, 5, 4)), Between(20, 50)];\n
source
"},{"location":"reference/#multi-array-datasets","title":"Multi-array datasets","text":"# DimensionalData.AbstractDimStack
\u2014 Type.
AbstractDimStack\n
Abstract supertype for dimensional stacks.
These have multiple layers of data, but share dimensions.
Notably, their behaviour lies somewhere between a DimArray
and a NamedTuple
:
- indexing with a
Symbol
as in dimstack[:symbol]
returns a DimArray
layer. - iteration amd
map
are apply over array layers, as indexed with a Symbol
. getindex
and many base methods are applied as for DimArray
- to avoid the need to allways use map
.
This design gives very succinct code when working with many-layered, mixed-dimension objects. But it may be jarring initially - the most surprising outcome is that dimstack[1]
will return a NamedTuple
of values for the first index in all layers, while first(dimstack)
will return the first value of the iterator - the DimArray
for the first layer.
See DimStack
for the concrete implementation. Most methods are defined on the abstract type.
To extend AbstractDimStack
, implement argument and keyword version of rebuild
and also rebuild_from_arrays
.
The constructor of an AbstractDimStack
must accept a NamedTuple
.
source
# DimensionalData.DimStack
\u2014 Type.
DimStack <: AbstractDimStack\n\nDimStack(data::AbstractDimArray...)\nDimStack(data::Tuple{Vararg{AbstractDimArray}})\nDimStack(data::NamedTuple{Keys,Vararg{AbstractDimArray}})\nDimStack(data::NamedTuple, dims::DimTuple; metadata=NoMetadata())\n
DimStack holds multiple objects sharing some dimensions, in a NamedTuple
.
Notably, their behaviour lies somewhere between a DimArray
and a NamedTuple
:
- indexing with a
Symbol
as in dimstack[:symbol]
returns a DimArray
layer. - iteration amd
map
are apply over array layers, as indexed with a Symbol
. getindex
or view
with Int
, Dimension
s or Selector
s that resolve to Int
will return a NamedTuple
of values from each layer in the stack. This has very good performace, and avoids the need to always use map
. getindex
or view
with a Vector
or Colon
will return another DimStack
where all data layers have been sliced. setindex!
must pass a Tuple
or NamedTuple
maching the layers. - many base and
Statistics
methods (sum
, mean
etc) will work as for a DimArray
again removing the need to use map
.
For example, here we take the mean over the time dimension for all layers :
mean(mydimstack; dims=Ti)\n
And this equivalent to:
map(A -> mean(A; dims=Ti), mydimstack)\n
This design gives succinct code when working with many-layered, mixed-dimension objects.
But it may be jarring initially - the most surprising outcome is that dimstack[1]
will return a NamedTuple
of values for the first index in all layers, while first(dimstack)
will return the first value of the iterator - the DimArray
for the first layer.
DimStack
can be constructed from multiple AbstractDimArray
or a NamedTuple
of AbstractArray
and a matching dims
tuple.
Most Base
and Statistics
methods that apply to AbstractArray
can be used on all layers of the stack simulataneously. The result is a DimStack
, or a NamedTuple
if methods like mean
are used without dims
arguments, and return a single non-array value.
Example
julia> using DimensionalData\n\njulia> A = [1.0 2.0 3.0; 4.0 5.0 6.0];\n\njulia> dimz = (X([:a, :b]), Y(10.0:10.0:30.0))\nX Symbol[:a, :b],\nY 10.0:10.0:30.0\n\njulia> da1 = DimArray(1A, dimz; name=:one);\n\njulia> da2 = DimArray(2A, dimz; name=:two);\n\njulia> da3 = DimArray(3A, dimz; name=:three);\n\njulia> s = DimStack(da1, da2, da3);\n\njulia> s[At(:b), At(10.0)]\n(one = 4.0, two = 8.0, three = 12.0)\n\njulia> s[X(At(:a))] isa DimStack\ntrue\n
source
"},{"location":"reference/#dimension-indices-generators","title":"Dimension indices generators","text":"# DimensionalData.DimIndices
\u2014 Type.
DimIndices <: AbstractArray\n\nDimIndices(x)\nDimIndices(dims::Tuple)\nDimIndices(dims::Dimension)\n
Like CartesianIndices
, but for Dimension
s. Behaves as an Array
of Tuple
of Dimension(i)
for all combinations of the axis indices of dims
.
This can be used to view/index into arbitrary dimensions over an array, and is especially useful when combined with otherdims
, to iterate over the indices of unknown dimension.
source
# DimensionalData.DimKeys
\u2014 Type.
DimKeys <: AbstractArray\n\nDimKeys(x)\nDimKeys(dims::Tuple)\nDimKeys(dims::Dimension)\n
Like CartesianIndices
, but for the lookup values of Dimensions. Behaves as an Array
of Tuple
of Dimension(At(lookupvalue))
for all combinations of the lookup values of dims
.
source
# DimensionalData.DimPoints
\u2014 Type.
DimPoints <: AbstractArray\n\nDimPoints(x; order)\nDimPoints(dims::Tuple; order)\nDimPoints(dims::Dimension; order)\n
Like CartesianIndices
, but for the point values of the dimension index. Behaves as an Array
of Tuple
lookup values (whatever they are) for all combinations of the lookup values of dims
.
Either a Dimension
, a Tuple
of Dimension
or an object that defines a dims
method can be passed in.
Keywords
order
: determines the order of the points, the same as the order of dims
by default.
source
"},{"location":"reference/#tablesjltabletraitsjl-interface","title":"Tables.jl/TableTraits.jl interface","text":"# DimensionalData.AbstractDimTable
\u2014 Type.
AbstractDimTable <: Tables.AbstractColumns\n
Abstract supertype for dim tables
source
# DimensionalData.DimTable
\u2014 Type.
DimTable <: AbstractDimTable\n\nDimTable(A::AbstractDimArray)\n
Construct a Tables.jl/TableTraits.jl compatible object out of an AbstractDimArray
.
This table will have a column for the array data and columns for each Dimension
index, as a [DimColumn
]. These are lazy, and generated as required.
Column names are converted from the dimension types using DimensionalData.dim2key
. This means type Ti
becomes the column name :Ti
, and Dim{:custom}
becomes :custom
.
To get dimension columns, you can index with Dimension
(X()
) or Dimension
type (X
) as well as the regular Int
or Symbol
.
source
# DimensionalData.DimColumn
\u2014 Type.
DimColumn{T,D<:Dimension} <: AbstractVector{T}\n\nDimColumn(dim::Dimension, dims::Tuple{Vararg{DimTuple}})\nDimColumn(dim::DimColumn, length::Int, dimstride::Int)\n
A table column based on a Dimension
and it's relationship with other Dimension
s in dims
.
length
is the product of all dim lengths (usually the length of the corresponding array data), while stride is the product of the preceding dimension lengths, which may or may not be the real stride of the corresponding array depending on the data type. For A isa Array
, the dimstride
will match the stride
.
When the second argument is a Tuple
of Dimension
, the length
and dimstride
fields are calculated from the dimensions, relative to the column dimension dim
.
This object will be returned as a column of DimTable
.
source
"},{"location":"reference/#common-methods","title":"Common methods","text":"Common functions for obtaining information from objects:
# DimensionalData.Dimensions.dims
\u2014 Function.
dims(x, [dims::Tuple]) => Tuple{Vararg{Dimension}}\ndims(x, dim) => Dimension\n
Return a tuple of Dimension
s for an object, in the order that matches the axes or columns of the underlying data.
dims
can be Dimension
, Dimension
types, or Symbols
for Dim{Symbol}
.
The default is to return nothing
.
source
# DimensionalData.Dimensions.refdims
\u2014 Function.
refdims(x, [dims::Tuple]) => Tuple{Vararg{Dimension}}\nrefdims(x, dim) => Dimension\n
Reference dimensions for an array that is a slice or view of another array with more dimensions.
slicedims(a, dims)
returns a tuple containing the current new dimensions and the new reference dimensions. Refdims can be stored in a field or disgarded, as it is mostly to give context to plots. Ignoring refdims will simply leave some captions empty.
The default is to return an empty Tuple
()
.
source
# DimensionalData.Dimensions.LookupArrays.metadata
\u2014 Function.
metadata(x) => (object metadata)\nmetadata(x, dims::Tuple) => Tuple (Dimension metadata)\nmetadata(xs::Tuple) => Tuple\n
Returns the metadata for an object or for the specified dimension(s)
Second argument dims
can be Dimension
s, Dimension
types, or Symbols
for Dim{Symbol}
.
source
# DimensionalData.Dimensions.name
\u2014 Function.
name(x) => Symbol\nname(xs:Tuple) => NTuple{N,Symbol}\nname(x, dims::Tuple) => NTuple{N,Symbol}\nname(x, dim) => Symbol\n
Get the name of an array or Dimension, or a tuple of of either as a Symbol.
Second argument dims
can be Dimension
s, Dimension
types, or Symbols
for Dim{Symbol}
.
source
Utility methods for transforming DimensionalData objects:
# DimensionalData.Dimensions.LookupArrays.set
\u2014 Function.
set(x, val)\nset(x, args::Pairs...) => x with updated field/s\nset(x, args...; kw...) => x with updated field/s\nset(x, args::Tuple{Vararg{Dimension}}; kw...) => x with updated field/s\n\nset(dim::Dimension, index::AbstractArray) => Dimension\nset(dim::Dimension, lookup::LookupArray) => Dimension\nset(dim::Dimension, lookupcomponent::LookupArrayTrait) => Dimension\nset(dim::Dimension, metadata::AbstractMetadata) => Dimension\n
Set the properties of an object, its internal data or the traits of its dimensions and lookup index.
As DimensionalData is so strongly typed you do not need to specify what field of a LookupArray
to set
- there is no ambiguity.
To set fields of a LookupArray
you need to specify the dimension. This can be done using X => val
pairs, X = val
keyword arguments, or X(val)
wrapped arguments.
When a Dimension
or LookupArray
is passed to set
to replace the existing ones, fields that are not set will keep their original values.
Notes:
Changing a lookup index range/vector will also update the step size and order where applicable.
Setting the Order
like ForwardOrdered
will not reverse the array or dimension to match. Use reverse
and reorder
to do this.
Examples
julia> using DimensionalData; const DD = DimensionalData\nDimensionalData\n\njulia> da = DimArray(zeros(3, 4), (custom=10.0:010.0:30.0, Z=-20:010.0:10.0));\n\njulia> set(da, ones(3, 4))\n3\u00d74 DimArray{Float64,2} with dimensions:\n Dim{:custom} Sampled{Float64} 10.0:10.0:30.0 ForwardOrdered Regular Points,\n Z Sampled{Float64} -20.0:10.0:10.0 ForwardOrdered Regular Points\n -20.0 -10.0 0.0 10.0\n 10.0 1.0 1.0 1.0 1.0\n 20.0 1.0 1.0 1.0 1.0\n 30.0 1.0 1.0 1.0 1.0 \n
Change the Dimension
wrapper type:
julia> set(da, :Z => Ti, :custom => Z)\n3\u00d74 DimArray{Float64,2} with dimensions:\n Z Sampled{Float64} 10.0:10.0:30.0 ForwardOrdered Regular Points,\n Ti Sampled{Float64} -20.0:10.0:10.0 ForwardOrdered Regular Points\n -20.0 -10.0 0.0 10.0\n 10.0 0.0 0.0 0.0 0.0\n 20.0 0.0 0.0 0.0 0.0\n 30.0 0.0 0.0 0.0 0.0 \n
Change the lookup Vector
:
julia> set(da, Z => [:a, :b, :c, :d], :custom => [4, 5, 6])\n3\u00d74 DimArray{Float64,2} with dimensions:\n Dim{:custom} Sampled{Int64} Int64[4, 5, 6] ForwardOrdered Regular Points,\n Z Sampled{Symbol} Symbol[:a, :b, :c, :d] ForwardOrdered Regular Points\n :a :b :c :d\n 4 0.0 0.0 0.0 0.0\n 5 0.0 0.0 0.0 0.0\n 6 0.0 0.0 0.0 0.0\n
Change the LookupArray
type:
julia> set(da, Z=DD.NoLookup(), custom=DD.Sampled())\n3\u00d74 DimArray{Float64,2} with dimensions:\n Dim{:custom} Sampled{Float64} 10.0:10.0:30.0 ForwardOrdered Regular Points,\n Z\n 10.0 0.0 0.0 0.0 0.0\n 20.0 0.0 0.0 0.0 0.0\n 30.0 0.0 0.0 0.0 0.0\n
Change the Sampling
trait:
julia> set(da, :custom => DD.Irregular(10, 12), Z => DD.Regular(9.9))\n3\u00d74 DimArray{Float64,2} with dimensions:\n Dim{:custom} Sampled{Float64} 10.0:10.0:30.0 ForwardOrdered Irregular Points,\n Z Sampled{Float64} -20.0:10.0:10.0 ForwardOrdered Regular Points\n -20.0 -10.0 0.0 10.0\n 10.0 0.0 0.0 0.0 0.0\n 20.0 0.0 0.0 0.0 0.0\n 30.0 0.0 0.0 0.0 0.0\n
source
# DimensionalData.Dimensions.LookupArrays.rebuild
\u2014 Function.
rebuild(x, args...)\nrebuild(x; kw...)\n
Rebuild an object struct with updated field values.
x
can be a AbstractDimArray
, a Dimension
, LookupArray
or other custom types.
This is an abstraction that alows inbuilt and custom types to be rebuilt to update their fields, as most objects in DimensionalData.jl are immutable.
The arguments version can be concise but depends on a fixed order defined for some DimensionalData objects. It should be defined based on the object type in DimensionalData, adding the fields specific to your object.
The keyword version ignores order, and is mostly automated using ConstructionBase.setproperties
. It should only be defined if your object has missing fields or fields with different names to DimensionalData objects.
The arguments required are defined for the abstract type that has a rebuild
method.
source
# DimensionalData.modify
\u2014 Function.
modify(f, A::AbstractDimArray) => AbstractDimArray\nmodify(f, s::AbstractDimStack) => AbstractDimStack\nmodify(f, dim::Dimension) => Dimension\nmodify(f, x, lookupdim::Dimension) => typeof(x)\n
Modify the parent data, rebuilding the object wrapper without change. f
must return a AbstractArray
of the same size as the original.
This method is mostly useful as a way of swapping the parent array type of an object.
Example
If we have a previously-defined DimArray
, we can copy it to an Nvidia GPU with:
A = DimArray(rand(100, 100), (X, Y))\nmodify(CuArray, A)\n
This also works for all the data layers in a DimStack
.
source
# DimensionalData.broadcast_dims
\u2014 Function.
broadcast_dims(f, sources::AbstractDimArray...) => AbstractDimArray\n
Broadcast function f
over the AbstractDimArray
s in sources
, permuting and reshaping dimensions to match where required. The result will contain all the dimensions in all passed in arrays in the order in which they are found.
Arguments
sources
: AbstractDimArrays
to broadcast over with f
.
This is like broadcasting over every slice of A
if it is sliced by the dimensions of B
.
source
# DimensionalData.broadcast_dims!
\u2014 Function.
broadcast_dims!(f, dest::AbstractDimArray, sources::AbstractDimArray...) => dest\n
Broadcast function f
over the AbstractDimArray
s in sources
, writing to dest
. sources
are permuting and reshaping dimensions to match where required.
The result will contain all the dimensions in all passed in arrays, in the order in which they are found.
Arguments
dest
: AbstractDimArray
to update. sources
: AbstractDimArrays
to broadcast over with f
.
source
# DimensionalData.reorder
\u2014 Function.
reorder(A::AbstractDimArray, order::Pair) => AbstractDimArray\nreorder(A::Dimension, order::Order) => AbstractDimArray\n
Reorder every dims index/array to order
, or reorder index for the the given dimension(s) to the Order
they wrap.
order
can be an Order
, or Dimeension => Order
pairs.
If no axis reversal is required the same objects will be returned, without allocation.
source
# Base.cat
\u2014 Function.
Base.cat(stacks::AbstractDimStack...; [keys=keys(stacks[1])], dims)\n
Concatenate all or a subset of layers for all passed in stacks.
Keywords
keys
: Tuple
of Symbol
for the stack keys to concatenate. dims
: Dimension of child array to concatenate on.
Example
Concatenate the :seasurfacetemp and :humidity layers in the time dimension:
cat(stacks...; keys=(:sea_surface_temp, :humidity), dims=Ti)\n
source
# Base.map
\u2014 Function.
Base.map(f, stacks::AbstractDimStack...)\n
Apply function f
to each layer of the stacks
.
If f
returns DimArray
s the result will be another DimStack
. Other values will be returned in a NamedTuple
.
source
# Base.copy!
\u2014 Function.
Base.copy!(dst::AbstractArray, src::AbstractGimStack, key::Key)\n
Copy the stack layer key
to dst
, which can be any AbstractArray
.
Example
Copy the :humidity
layer from stack
to array
.
copy!(array, stack, :humidity)\n
source
Base.copy!(dst::AbstractDimStack, src::AbstractDimStack, [keys=keys(dst)])\n
Copy all or a subset of layers from one stack to another.
Example
Copy just the :sea_surface_temp
and :humidity
layers from src
to dst
.
copy!(dst::AbstractDimStack, src::AbstractDimStack, keys=(:sea_surface_temp, :humidity))\n
source
# Base.eachslice
\u2014 Function.
Base.eachslice(stack::AbstractDimStack; dims)\n
Create a generator that iterates over dimensions dims
of stack
, returning stacks that select all the data from the other dimensions in stack
using views.
The generator has size
and axes
equivalent to those of the provided dims
.
Examples
julia> ds = DimStack((\nx=DimArray(randn(2, 3, 4), (X([:x1, :x2]), Y(1:3), Z)),\ny=DimArray(randn(2, 3, 5), (X([:x1, :x2]), Y(1:3), Ti))\n));\n\njulia> slices = eachslice(ds; dims=(Z, X));\n\njulia> size(slices)\n(4, 2)\n\njulia> map(dims, axes(slices))\nZ,\nX Categorical{Symbol} Symbol[x1, x2] ForwardOrdered\n\njulia> first(slices)\nDimStack with dimensions:\nY Sampled{Int64} 1:3 ForwardOrdered Regular Points,\nTi\nand 2 layers:\n:x Float64 dims: Y (3)\n:y Float64 dims: Y, Ti (3\u00d75)\n
source
Most base methods work as expected, using Dimension
wherever a dims
keyword is used. They are not allspecifically documented here.
Shorthand constructors:
# Base.fill
\u2014 Function.
Base.fill(x, dims::Dimension...; kw...) => DimArray\nBase.fill(x, dims::Tuple{Vararg{Dimension}}; kw...) => DimArray\n
Create a DimArray
with a fill value of x
.
There are two kinds of Dimension
value acepted:
- A
Dimension
holding an AbstractVector
will set the dimension index to that AbstractVector
, and detect the dimension lookup. - A
Dimension
holding an Integer
will set the length of the axis, and set the dimension lookup to NoLookup
.
Keywords are the same as for DimArray
.
Example
```@doctest julia> using DimensionalData
julia> rand(Bool, X(2), Y(4)) 2\u00d74 DimArray{Bool,2} with dimensions: X, Y 1 0 0 1 1 0 1 1
<a target='_blank' href='https://github.com/rafaqz/DimensionalData.jl/blob/ec4d5a549948be8d18b5aca7506f582dbaba33ae/src/array/array.jl#L378-L401' class='documenter-source'>source</a><br>\n\n<a id='Base.rand' href='#Base.rand'>#</a>\n**`Base.rand`** — *Function*.\n\n\n\n```julia\nBase.rand(x, dims::Dimension...; kw...) => DimArray\nBase.rand(x, dims::Tuple{Vararg{Dimension}}; kw...) => DimArray\nBase.rand(r::AbstractRNG, x, dims::Tuple{Vararg{Dimension}}; kw...) => DimArray\nBase.rand(r::AbstractRNG, x, dims::Dimension...; kw...) => DimArray\n
Create a DimArray
of random values.
There are two kinds of Dimension
value acepted:
- A
Dimension
holding an AbstractVector
will set the dimension index to that AbstractVector
, and detect the dimension lookup. - A
Dimension
holding an Integer
will set the length of the axis, and set the dimension lookup to NoLookup
.
Keywords are the same as for DimArray
.
Example
julia> using DimensionalData\n\njulia> rand(Bool, X(2), Y(4))\n2\u00d74 DimArray{Bool,2} with dimensions: X, Y\n1 0 0 1\n1 0 1 1\n\njulia> rand(X([:a, :b, :c]), Y(100.0:50:200.0))\n3\u00d73 DimArray{Float64,2} with dimensions:\nX: Symbol[a, b, c] Categorical: Unordered,\nY: 100.0:50.0:200.0 Sampled: Ordered Regular Points\n0.43204 0.835111 0.624231\n0.752868 0.471638 0.193652\n0.484558 0.846559 0.455256\n
source
# Base.zeros
\u2014 Function.
Base.zeros(x, dims::Dimension...; kw...) => DimArray\nBase.zeros(x, dims::Tuple{Vararg{Dimension}}; kw...) => DimArray\n
Create a DimArray
of zeros.
There are two kinds of Dimension
value acepted:
- A
Dimension
holding an AbstractVector
will set the dimension index to that AbstractVector
, and detect the dimension lookup. - A
Dimension
holding an Integer
will set the length of the axis, and set the dimension lookup to NoLookup
.
Keywords are the same as for DimArray
.
Example
```@doctest julia> using DimensionalData
julia> zeros(Bool, X(2), Y(4)) 2\u00d74 DimArray{Bool,2} with dimensions: X, Y 0 0 0 0 0 0 0 0
julia> zeros(X([:a, :b, :c]), Y(100.0:50:200.0)) 3\u00d73 DimArray{Float64,2} with dimensions: X: Symbol[a, b, c] Categorical: Unordered, Y: 100.0:50.0:200.0 Sampled: Ordered Regular Points 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<a target='_blank' href='https://github.com/rafaqz/DimensionalData.jl/blob/ec4d5a549948be8d18b5aca7506f582dbaba33ae/src/array/array.jl#L440-L471' class='documenter-source'>source</a><br>\n\n<a id='Base.ones' href='#Base.ones'>#</a>\n**`Base.ones`** — *Function*.\n\n\n\n```julia\nBase.ones(x, dims::Dimension...; kw...) => DimArray\nBase.ones(x, dims::Tuple{Vararg{Dimension}}; kw...) => DimArray\n
Create a DimArray
of ones.
There are two kinds of Dimension
value acepted:
- A
Dimension
holding an AbstractVector
will set the dimension index to that AbstractVector
, and detect the dimension lookup. - A
Dimension
holding an Integer
will set the length of the axis, and set the dimension lookup to NoLookup
.
Keywords are the same as for DimArray
.
Example
```@doctest julia> using DimensionalData
julia> ones(Bool, X(2), Y(4)) 2\u00d74 DimArray{Bool,2} with dimensions: X, Y 1 1 1 1 1 1 1 1
julia> ones(X([:a, :b, :c]), Y(100.0:50:200.0)) 3\u00d73 DimArray{Float64,2} with dimensions: X: Symbol[a, b, c] Categorical: Unordered, Y: 100.0:50.0:200.0 Sampled: Ordered Regular Points 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
<a target='_blank' href='https://github.com/rafaqz/DimensionalData.jl/blob/ec4d5a549948be8d18b5aca7506f582dbaba33ae/src/array/array.jl#L474-L505' class='documenter-source'>source</a><br>\n\n\n<a id='Dimensions'></a>\n\n<a id='Dimensions-1'></a>\n\n# Dimensions\n\n\nHandling of Dimensions is kept in a sub-module `Dimensions`.\n\n<a id='DimensionalData.Dimensions' href='#DimensionalData.Dimensions'>#</a>\n**`DimensionalData.Dimensions`** — *Module*.\n\n\n\nDimensions\n\nSub-module for [`Dimension`](reference.md#DimensionalData.Dimensions.Dimension)s wrappers, and operations on them used in DimensionalData.jl.\n\nTo load `Dimensions` types and methods into scope:\n\n```julia\nusing DimensionalData\nusing DimensionalData.Dimensions\n
source
Dimensions have a type-heirarchy that organises plotting and dimension matching.
# DimensionalData.Dimensions.Dimension
\u2014 Type.
Dimension\n
Abstract supertype of all dimension types.
Example concrete implementations are X
, Y
, Z
, Ti
(Time), and the custom [Dim
]@ref) dimension.
Dimension
s label the axes of an AbstractDimArray
, or other dimensional objects, and are used to index into the array.
They may also provide an alternate index to lookup for each array axis. This may be any AbstractVector
matching the array axis length, or a Val
holding a tuple for compile-time index lookups.
Dimension
s also have lookup
and metadata
fields.
lookup
gives more details about the dimension, such as that it is Categorical
or Sampled
as Points
or Intervals
along some transect. DimensionalData will attempt to guess the lookup from the passed-in index value.
Example:
using DimensionalData, Dates\n\nx = X(2:2:10)\ny = Y(['a', 'b', 'c'])\nti = Ti(DateTime(2021, 1):Month(1):DateTime(2021, 12))\n\nA = DimArray(zeros(3, 5, 12), (y, x, ti))\n\n# output\n\n3\u00d75\u00d712 DimArray{Float64,3} with dimensions:\nY Categorical{Char} Char['a', 'b', 'c'] ForwardOrdered,\nX Sampled{Int64} 2:2:10 ForwardOrdered Regular Points,\nTi Sampled{DateTime} DateTime(\"2021-01-01T00:00:00\"):Month(1):DateTime(\"2021-12-01T00:00:00\") ForwardOrdered Regular Points\n[:, :, 1]\n2 4 6 8 10\n'a' 0.0 0.0 0.0 0.0 0.0\n'b' 0.0 0.0 0.0 0.0 0.0\n'c' 0.0 0.0 0.0 0.0 0.0\n[and 11 more slices...]\n
For simplicity, the same Dimension
types are also used as wrappers in getindex
, like:
x = A[X(2), Y(3)]\n\n# output\n\n12-element DimArray{Float64,1} with dimensions:\nTi Sampled{DateTime} DateTime(\"2021-01-01T00:00:00\"):Month(1):DateTime(\"2021-12-01T00:00:00\") ForwardOrdered Regular Points\nand reference dimensions:\nY Categorical{Char} Char['c'] ForwardOrdered,\nX Sampled{Int64} 4:2:4 ForwardOrdered Regular Points\n2021-01-01T00:00:00 0.0\n2021-02-01T00:00:00 0.0\n2021-03-01T00:00:00 0.0\n2021-04-01T00:00:00 0.0\n\u22ee\n2021-10-01T00:00:00 0.0\n2021-11-01T00:00:00 0.0\n2021-12-01T00:00:00 0.0\n
A Dimension
can also wrap Selector
.
x = A[X(Between(3, 4)), Y(At('b'))]\n\n# output\n\n1\u00d712 DimArray{Float64,2} with dimensions:\nX Sampled{Int64} 4:2:4 ForwardOrdered Regular Points,\nTi Sampled{DateTime} DateTime(\"2021-01-01T00:00:00\"):Month(1):DateTime(\"2021-12-01T00:00:00\") ForwardOrdered Regular Points\nand reference dimensions:\nY Categorical{Char} Char['b'] ForwardOrdered\n2021-01-01T00:00:00 \u2026 2021-12-01T00:00:00\n4 0.0 0.0\n
Dimension
objects may have lookup
and metadata
fields to track additional information about the data and the index, and their relationship.
source
# DimensionalData.Dimensions.DependentDim
\u2014 Type.
DependentDim <: Dimension\n
Abstract supertype for Dependent dimensions. These will plot on the Y axis.
source
# DimensionalData.Dimensions.IndependentDim
\u2014 Type.
IndependentDim <: Dimension\n
Abstract supertype for independent dimensions. Thise will plot on the X axis.
source
# DimensionalData.Dimensions.XDim
\u2014 Type.
XDim <: IndependentDim\n
Abstract supertype for all X dimensions.
source
# DimensionalData.Dimensions.YDim
\u2014 Type.
YDim <: DependentDim\n
Abstract supertype for all Y dimensions.
source
# DimensionalData.Dimensions.ZDim
\u2014 Type.
ZDim <: DependentDim\n
Abstract supertype for all Z dimensions.
source
# DimensionalData.Dimensions.TimeDim
\u2014 Type.
TimeDim <: IndependentDim\n
Abstract supertype for all time dimensions.
In a TimeDime
with Interval
sampling the locus will automatically be set to Start()
. Dates and times generally refer to the start of a month, hour, second etc., not the central point as is more common with spatial data. `
source
# DimensionalData.Dimensions.X
\u2014 Type.
X <: XDim\n\nX(val=:)\n
X Dimension
. X <: XDim <: IndependentDim
Example:
xdim = X(2:2:10)\n# Or\nval = A[X(1)]\n# Or\nmean(A; dims=X)\n
source
# DimensionalData.Dimensions.Y
\u2014 Type.
Y <: YDim\n\nY(val=:)\n
Y Dimension
. Y <: YDim <: DependentDim
Example:
ydim = Y(['a', 'b', 'c'])\n# Or\nval = A[Y(1)]\n# Or\nmean(A; dims=Y)\n
source
# DimensionalData.Dimensions.Z
\u2014 Type.
Z <: ZDim\n\nZ(val=:)\n
Z Dimension
. Z <: ZDim <: Dimension
Example:
zdim = Z(10:10:100)\n# Or\nval = A[Z(1)]\n# Or\nmean(A; dims=Z)\n
source
# DimensionalData.Dimensions.Ti
\u2014 Type.
m Ti <: TimeDim
Ti(val=:)\n
Time Dimension
. Ti <: TimeDim <: IndependentDim
Time
is already used by Dates, and T
is a common type parameter, We use Ti
to avoid clashes.
Example:
timedim = Ti(DateTime(2021, 1):Month(1):DateTime(2021, 12))\n# Or\nval = A[Ti(1)]\n# Or\nmean(A; dims=Ti)\n
source
# DimensionalData.Dimensions.Dim
\u2014 Type.
Dim{S}(val=:)\n
A generic dimension. For use when custom dims are required when loading data from a file. Can be used as keyword arguments for indexing.
Dimension types take precedence over same named Dim
types when indexing with symbols, or e.g. creating Tables.jl keys.
using DimensionalData\n\ndim = Dim{:custom}(['a', 'b', 'c'])\n\n# output\n\nDim{:custom} Char['a', 'b', 'c']\n
source
# DimensionalData.Dimensions.Coord
\u2014 Type.
Coord <: Dimension\n
A coordinate dimension itself holds dimensions.
This allows combining point data with other dimensions, such as time.
Example
julia> using DimensionalData\n\njulia> dim = Coord([(1.0,1.0,1.0), (1.0,2.0,2.0), (3.0,4.0,4.0), (1.0,3.0,4.0)], (X(), Y(), Z()))\nCoord ::\nval: Tuple{Float64, Float64, Float64}[(1.0, 1.0, 1.0), (1.0, 2.0, 2.0), (3.0, 4.0, 4.0), (1.0, 3.0,\n4.0)]\nlookup: MergedLookup\nCoord{Vector{Tuple{Float64, Float64, Float64}}, DimensionalData.MergedLookup{Tuple{X{Colon, AutoLookup{Auto\nOrder}, NoMetadata}, Y{Colon, AutoLookup{AutoOrder}, NoMetadata}, Z{Colon, AutoLookup{AutoOrder}, NoMetada\nta}}}, NoMetadata}\n\njulia> da = DimArray(0.1:0.1:0.4, dim)\n4-element DimArray{Float64,1} with dimensions:\nCoord (): Tuple{Float64, Float64, Float64}[(1.0, 1.0, 1.0), (1.0, 2.0, 2.0), (3.0, 4.0, 4.0), (1.0,\n3.0, 4.0)]\nMergedLookup\n0.1\n0.2\n0.3\n0.4\n\njulia> da[Coord(Z(At(1.0)), Y(Between(1, 3)))]\n1-element DimArray{Float64,1} with dimensions:\nCoord (): Tuple{Float64, Float64, Float64}[(1.0, 1.0, 1.0)] MergedLookup\n0.1\n\njulia> da[Coord(4)] == 0.4\ntrue\n\njulia> da[Coord(Between(1, 5), :, At(4.0))]\n2-element DimArray{Float64,1} with dimensions:\nCoord (): Tuple{Float64, Float64, Float64}[(3.0, 4.0, 4.0), (1.0, 3.0, 4.0)] MergedLookup\n0.3\n0.4\n
source
# DimensionalData.Dimensions.AnonDim
\u2014 Type.
AnonDim <: Dimension\n\nAnonDim()\n
Anonymous dimension. Used when extra dimensions are created, such as during transpose of a vector.
source
# DimensionalData.Dimensions.@dim
\u2014 Macro.
@dim typ [supertype=Dimension] [name::String=string(typ)]\n
Macro to easily define new dimensions. The supertype will be inserted into the type of the dim. The default is simply YourDim <: Dimension
. Making a Dimesion inherit from XDim
, YDim
, ZDim
or TimeDim
will affect automatic plot layout and other methods that dispatch on these types. <: YDim
are plotted on the Y axis, <: XDim
on the X axis, etc.
Example:
using DimensionalData\nusing DimensionalData: @dim, YDim, XDim\n@dim Lat YDim \"latitude\"\n@dim Lon XDim \"Longitude\"\n# output\n
source
"},{"location":"reference/#exported-methods","title":"Exported methods","text":"# DimensionalData.Dimensions.hasdim
\u2014 Function.
hasdim([f], x, query::Tuple) => NTUple{Bool}\nhasdim([f], x, query...) => NTUple{Bool}\nhasdim([f], x, query) => Bool\n
Check if an object x
has dimensions that match or inherit from the query
dimensions.
Arguments
x
: any object with a dims
method, a Tuple
of Dimension
or a single Dimension
. query
: Tuple or single Dimension
or dimension Type
. f
: <:
by default, but can be >:
to match abstract types to concrete types.
Check if an object or tuple contains an Dimension
, or a tuple of dimensions.
Example
julia> using DimensionalData\n\njulia> A = DimArray(ones(10, 10, 10), (X, Y, Z));\n\njulia> hasdim(A, X)\ntrue\n\njulia> hasdim(A, (Z, X, Y))\n(true, true, true)\n\njulia> hasdim(A, Ti)\nfalse\n
source
# DimensionalData.Dimensions.dimnum
\u2014 Function.
dimnum(x, query::Tuple) => NTuple{Int}\ndimnum(x, query) => Int\n
Get the number(s) of Dimension
(s) as ordered in the dimensions of an object.
Arguments
x
: any object with a dims
method, a Tuple
of Dimension
or a single Dimension
. query
: Tuple, Array or single Dimension
or dimension Type
.
The return type will be a Tuple of Int
or a single Int
, depending on wether query
is a Tuple
or single Dimension
.
Example
julia> using DimensionalData\n\njulia> A = DimArray(ones(10, 10, 10), (X, Y, Z));\n\njulia> dimnum(A, (Z, X, Y))\n(3, 1, 2)\n\njulia> dimnum(A, Y)\n2\n
source
"},{"location":"reference/#non-exported-methods","title":"Non-exported methods","text":"# DimensionalData.Dimensions.lookup
\u2014 Function.
lookup(x::Dimension) => LookupArray\nlookup(x, [dims::Tuple]) => Tuple{Vararg{LookupArray}}\nlookup(x::Tuple) => Tuple{Vararg{LookupArray}}\nlookup(x, dim) => LookupArray\n
Returns the LookupArray
of a dimension. This dictates properties of the dimension such as array axis and index order, and sampling properties.
dims
can be a Dimension
, a dimension type, or a tuple of either.
source
# DimensionalData.Dimensions.label
\u2014 Function.
label(x) => String\nlabel(x, dims::Tuple) => NTuple{N,String}\nlabel(x, dim) => String\nlabel(xs::Tuple) => NTuple{N,String}\n
Get a plot label for data or a dimension. This will include the name and units if they exist, and anything else that should be shown on a plot.
Second argument dims
can be Dimension
s, Dimension
types, or Symbols
for Dim{Symbol}
.
source
# DimensionalData.Dimensions.dim2key
\u2014 Function.
dim2key(dim::Dimension) => Symbol\ndim2key(dims::Type{<:Dimension}) => Symbol\ndim2key(dims::Tuple) => Tuple{Symbol,Vararg}\n
Convert a dimension object to a simbol. X()
, Y()
, Ti()
etc will be converted. to :X
, :Y
, :Ti
, as with any other dims generated with the @dim
macro.
All other Dim{S}()
dimensions will generate Symbol
s S
.
source
# DimensionalData.Dimensions.key2dim
\u2014 Function.
key2dim(s::Symbol) => Dimension\nkey2dim(dims...) => Tuple{Dimension,Vararg}\nkey2dim(dims::Tuple) => Tuple{Dimension,Vararg}\n
Convert a symbol to a dimension object. :X
, :Y
, :Ti
etc will be converted. to X()
, Y()
, Ti()
, as with any other dims generated with the @dim
macro.
All other Symbol
s S
will generate Dim{S}()
dimensions.
source
# DimensionalData.Dimensions.dims2indices
\u2014 Function.
dims2indices(dim::Dimension, I) => NTuple{Union{Colon,AbstractArray,Int}}\n
Convert a Dimension
or Selector
I
to indices of Int
, AbstractArray
or Colon
.
source
# DimensionalData.Dimensions.LookupArrays.selectindices
\u2014 Function.
selectindices(lookups, selectors)\n
Converts Selector
to regular indices.
source
# DimensionalData.Dimensions.format
\u2014 Function.
format(dims, x) => Tuple{Vararg{Dimension,N}}\n
Format the passed-in dimension(s) dims
to match the object x
.
Errors are thrown if dims don't match the array dims or size, and any fields holding Auto-
objects are filled with guessed objects.
If a LookupArray
hasn't been specified, a lookup is chosen based on the type and element type of the index.
source
# DimensionalData.Dimensions.reducedims
\u2014 Function.
reducedims(x, dimstoreduce) => Tuple{Vararg{Dimension}}\n
Replace the specified dimensions with an index of length 1. This is usually to match a new array size where an axis has been reduced with a method like mean
or reduce
to a length of 1, but the number of dimensions has not changed.
LookupArray
traits are also updated to correspond to the change in cell step, sampling type and order.
source
# DimensionalData.Dimensions.swapdims
\u2014 Function.
swapdims(x::T, newdims) => T\nswapdims(dims::Tuple, newdims) => Tuple{Vararg{Dimension}}\n
Swap dimensions for the passed in dimensions, in the order passed.
Passing in the Dimension
types rewraps the dimension index, keeping the index values and metadata, while constructed Dimension
objectes replace the original dimension. nothing
leaves the original dimension as-is.
Arguments
x
: any object with a dims
method or a Tuple
of Dimension
. newdim
: Tuple of Dimension
or dimension Type
.
Example
using DimensionalData\nA = ones(X(2), Y(4), Z(2))\nDimensions.swapdims(A, (Dim{:a}, Dim{:b}, Dim{:c}))\n\n# output\n2\u00d74\u00d72 DimArray{Float64,3} with dimensions: Dim{:a}, Dim{:b}, Dim{:c}\n[:, :, 1]\n1.0 1.0 1.0 1.0\n1.0 1.0 1.0 1.0\n[and 1 more slices...]\n
source
# DimensionalData.Dimensions.slicedims
\u2014 Function.
slicedims(x, I) => Tuple{Tuple,Tuple}\nslicedims(f, x, I) => Tuple{Tuple,Tuple}\n
Slice the dimensions to match the axis values of the new array.
All methods return a tuple conatining two tuples: the new dimensions, and the reference dimensions. The ref dimensions are no longer used in the new struct but are useful to give context to plots.
Called at the array level the returned tuple will also include the previous reference dims attached to the array.
Arguments
f
: a function getindex
, view
or dotview
. This will be used for slicing getindex
is the default if f
is not included. x
: An AbstractDimArray
, Tuple
of Dimension
, or Dimension
I
: A tuple of Integer
, Colon
or AbstractArray
source
# DimensionalData.Dimensions.comparedims
\u2014 Function.
comparedims(A::AbstractDimArray...; kw...)\ncomparedims(A::Tuple...; kw...)\ncomparedims(A::Dimension...; kw...)\ncomparedims(::Type{Bool}, args...; kw...)\n
Check that dimensions or tuples of dimensions passed as each argument are the same, and return the first valid dimension. If AbstractDimArray
s are passed as arguments their dimensions are compared.
Empty tuples and nothing
dimension values are ignored, returning the Dimension
value if it exists.
Passing Bool
as the first argument means true
/false
will be returned, rather than throwing an error.
Keywords
These are all Bool
flags:
type
: compare dimension type, true
by default. valtype
: compare wrapped value type, false
by default. val
: compare wrapped values, false
by default. order
: compare order, false
by default. length
: compare lengths, true
by default. ignore_length_one
: ignore length 1
in comparisons, and return whichever dimension is not length 1, if any. This is useful in e.g. broadcasting comparisons. false
by default. warn
: a String
or nothing
. Used only for Bool
methods, to give a warning for false
values and include warn
in the warning text.
source
# DimensionalData.Dimensions.combinedims
\u2014 Function.
combinedims(xs; check=true)\n
Combine the dimensions of each object in xs
, in the order they are found.
source
# DimensionalData.Dimensions.otherdims
\u2014 Function.
otherdims(x, query) => Tuple{Vararg{Dimension,N}}\n
Get the dimensions of an object not in query
.
Arguments
x
: any object with a dims
method, a Tuple
of Dimension
. query
: Tuple or single Dimension
or dimension Type
. f
: <:
by default, but can be >:
to match abstract types to concrete types.
A tuple holding the unmatched dimensions is always returned.
Example
julia> using DimensionalData, DimensionalData.Dimensions\n\njulia> A = DimArray(ones(10, 10, 10), (X, Y, Z));\n\njulia> otherdims(A, X)\nY, Z\n\njulia> otherdims(A, (Y, Z))\nX\n
source
# DimensionalData.Dimensions.commondims
\u2014 Function.
commondims([f], x, query) => Tuple{Vararg{Dimension}}\n
This is basically dims(x, query)
where the order of the original is kept, unlike dims
where the query tuple determines the order
Also unlike dims
,commondims
always returns a Tuple
, no matter the input. No errors are thrown if dims are absent from either x
or query
.
f
is <:
by default, but can be >:
to sort abstract types by concrete types.
julia> using DimensionalData, .Dimensions\n\njulia> A = DimArray(ones(10, 10, 10), (X, Y, Z));\n\njulia> commondims(A, X)\nX\n\njulia> commondims(A, (X, Z))\nX, Z\n\njulia> commondims(A, Ti)\n()\n
source
# DimensionalData.Dimensions.sortdims
\u2014 Function.
sortdims([f], tosort, order) => Tuple\n
Sort dimensions tosort
by order
. Dimensions in order
but missing from tosort
are replaced with nothing
.
tosort
and order
can be Tuple
s or Vector
s or Dimension or dimension type. Abstract supertypes like TimeDim
can be used in order
.
f
is <:
by default, but can be >:
to sort abstract types by concrete types.
source
# DimensionalData.Dimensions.LookupArrays.basetypeof
\u2014 Function.
basetypeof(x) => Type\n
Get the \"base\" type of an object - the minimum required to define the object without it's fields. By default this is the full UnionAll
for the type. But custom basetypeof
methods can be defined for types with free type parameters.
In DimensionalData this is primariliy used for comparing Dimension
s, where Dim{:x}
is different from Dim{:y}
.
source
# DimensionalData.Dimensions.setdims
\u2014 Function.
setdims(X, newdims) => AbstractArray\nsetdims(::Tuple, newdims) => Tuple{Vararg{Dimension,N}}\n
Replaces the first dim matching <: basetypeof(newdim)
with newdim, and returns a new object or tuple with the dimension updated.
Arguments
x
: any object with a dims
method, a Tuple
of Dimension
or a single Dimension
. newdim
: Tuple or single Dimension
, Type
or Symbol
.
Example
using DimensionalData, DimensionalData.Dimensions, DimensionalData.LookupArrays\nA = ones(X(10), Y(10:10:100))\nB = setdims(A, Y(Categorical('a':'j'; order=ForwardOrdered())))\nlookup(B, Y)\n# output\nCategorical{Char} ForwardOrdered\nwrapping: 'a':1:'j'\n
source
# DimensionalData.Dimensions.dimsmatch
\u2014 Function.
dimsmatch([f], dim, query) => Bool\ndimsmatch([f], dims::Tuple, query::Tuple) => Bool\n
Compare 2 dimensions or Tuple
of Dimension
are of the same base type, or are at least rotations/transformations of the same type.
f
is <:
by default, but can be >:
to match abstract types to concrete types.
source
# DimensionalData.Dimensions.dimstride
\u2014 Function.
dimstride(x, dim) => Int\n
Get the stride of the dimension relative to the other dimensions.
This may or may not be equal to the stride of the related array, although it will be for Array
.
Arguments
x
is any object with a dims
method, or a Tuple
of Dimension
. dim
is a Dimension
, Dimension
type, or and Int
. Using an Int
is not type-stable.
source
# DimensionalData.refdims_title
\u2014 Function.
refdims_title(A::AbstractDimArray)\nrefdims_title(refdims::Tuple)\nrefdims_title(refdim::Dimension)\n
Generate a title string based on reference dimension values.
source
# DimensionalData.rebuild_from_arrays
\u2014 Function.
rebuild_from_arrays(s::AbstractDimStack, das::NamedTuple{<:Any,<:Tuple{Vararg{AbstractDimArray}}}; kw...)\n
Rebuild an AbstractDimStack
from a Tuple
or NamedTuple
of AbstractDimArray
and an existing stack.
Keywords
Keywords are simply the fields of the stack object:
data
dims
refdims
metadata
layerdims
layermetadata
source
"},{"location":"reference/#lookuparrays","title":"LookupArrays","text":"# DimensionalData.Dimensions.LookupArrays
\u2014 Module.
LookupArrays\n
Module for LookupArrays
and [Selector
]s used in DimensionalData.jl
LookupArrays
defines traits and AbstractArray
wrappers that give specific behaviours for a lookup index when indexed with Selector
.
For example, these allow tracking over array order so fast indexing works evne when the array is reversed.
To load LookupArrays types and methods into scope:
using DimensionalData\nusing DimensionalData.LookupArrays\n
source
"},{"location":"reference/#selectors","title":"Selectors","text":"# DimensionalData.Dimensions.LookupArrays.Selector
\u2014 Type.
Selector\n
Abstract supertype for all selectors.
Selectors are wrappers that indicate that passed values are not the array indices, but values to be selected from the dimension index, such as DateTime
objects for a Ti
dimension.
Selectors provided in DimensionalData are:
At
Between
Touches
Near
Where
Contains
source
# DimensionalData.Dimensions.LookupArrays.IntSelector
\u2014 Type.
IntSelector <: Selector\n
Abstract supertype for Selector
s that return a single Int
index.
source
# DimensionalData.Dimensions.LookupArrays.ArraySelector
\u2014 Type.
ArraySelector <: Selector\n
Abstract supertype for Selector
s that return an AbstractArray
.
source
# DimensionalData.Dimensions.LookupArrays.At
\u2014 Type.
At <: IntSelector\n\nAt(x, atol, rtol)\nAt(x; atol=nothing, rtol=nothing)\n
Selector that exactly matches the value on the passed-in dimensions, or throws an error. For ranges and arrays, every intermediate value must match an existing value - not just the end points.
x
can be any value or Vector
of values.
atol
and rtol
are passed to isapprox
. For Number
rtol
will be set to Base.rtoldefault
, otherwise nothing
, and wont be used.
Example
using DimensionalData\n\nA = DimArray([1 2 3; 4 5 6], (X(10:10:20), Y(5:7)))\nA[X(At(20)), Y(At(6))]\n\n# output\n\n5\n
source
# DimensionalData.Dimensions.LookupArrays.Near
\u2014 Type.
Near <: IntSelector\n\nNear(x)\n
Selector that selects the nearest index to x
.
With Points
this is simply the index values nearest to the x
, however with Intervals
it is the interval center nearest to x
. This will be offset from the index value for Start
and End
loci.
Example
using DimensionalData\n\nA = DimArray([1 2 3; 4 5 6], (X(10:10:20), Y(5:7)))\nA[X(Near(23)), Y(Near(5.1))]\n\n# output\n4\n
source
# DimensionalData.Dimensions.LookupArrays.Between
\u2014 Type.
Between <: ArraySelector\n\nBetween(a, b)\n
Depreciated: use a..b
instead of Between(a, b)
. Other Interval
objects from IntervalSets.jl, like `OpenInterval(a, b) will also work, giving the correct open/closed boundaries.
Between
will e removed in furture to avoid clashes with DataFrames.Between
.
Selector that retreive all indices located between 2 values, evaluated with >=
for the lower value, and <
for the upper value. This means the same value will not be counted twice in 2 adjacent Between
selections.
For Intervals
the whole interval must be lie between the values. For Points
the points must fall between the values. Different Sampling
types may give different results with the same input - this is the intended behaviour.
Between
for Irregular
intervals is a little complicated. The interval is the distance between a value and the next (for Start
locus) or previous (for End
locus) value.
For Center
, we take the mid point between two index values as the start and end of each interval. This may or may not make sense for the values in your indes, so use Between
with Irregular
Intervals(Center())
with caution.
Example
using DimensionalData\n\nA = DimArray([1 2 3; 4 5 6], (X(10:10:20), Y(5:7)))\nA[X(Between(15, 25)), Y(Between(4, 6.5))]\n\n# output\n\n1\u00d72 DimArray{Int64,2} with dimensions:\nX Sampled{Int64} 20:10:20 ForwardOrdered Regular Points,\nY Sampled{Int64} 5:6 ForwardOrdered Regular Points\n5 6\n20 4 5\n
source
# DimensionalData.Dimensions.LookupArrays.Touches
\u2014 Type.
Touches <: ArraySelector\n\nTouches(a, b)\n
Selector that retreives all indices touching the closed interval 2 values, for the maximum possible area that could interact with the supplied range.
This can be better than ..
when e.g. subsetting an area to rasterize, as you may wish to include pixels that just touch the area, rather than those that fall within it.
Touches is different to using closed intervals when the lookups also contain intervals - if any of the intervals touch, they are included. With ..
they are discarded unless the whole cell interval falls inside the selector interval.
Example
using DimensionalData\n\nA = DimArray([1 2 3; 4 5 6], (X(10:10:20), Y(5:7)))\nA[X(Touches(15, 25)), Y(Touches(4, 6.5))]\n\n# output\n1\u00d72 DimArray{Int64,2} with dimensions:\nX Sampled{Int64} 20:10:20 ForwardOrdered Regular Points,\nY Sampled{Int64} 5:6 ForwardOrdered Regular Points\n5 6\n20 4 5\n
source
# DimensionalData.Dimensions.LookupArrays.Contains
\u2014 Type.
Contains <: IntSelector\n\nContains(x)\n
Selector that selects the interval the value is contained by. If the interval is not present in the index, an error will be thrown.
Can only be used for Intervals
or Categorical
.
Example
using DimensionalData; const DD = DimensionalData\ndims_ = X(10:10:20; sampling=DD.Intervals(DD.Center())),\nY(5:7; sampling=DD.Intervals(DD.Center()))\nA = DimArray([1 2 3; 4 5 6], dims_)\nA[X(Contains(8)), Y(Contains(6.8))]\n\n# output\n3\n
source
# DimensionalData.Dimensions.LookupArrays.Where
\u2014 Type.
Where <: ArraySelector\n\nWhere(f::Function)\n
Selector that filters a dimension lookup by any function that accepts a single value and returns a Bool
.
Example
using DimensionalData\n\nA = DimArray([1 2 3; 4 5 6], (X(10:10:20), Y(19:21)))\nA[X(Where(x -> x > 15)), Y(Where(x -> x in (19, 21)))]\n\n# output\n\n1\u00d72 DimArray{Int64,2} with dimensions:\nX Sampled{Int64} Int64[20] ForwardOrdered Regular Points,\nY Sampled{Int64} Int64[19, 21] ForwardOrdered Regular Points\n19 21\n20 4 6\n
source
# DimensionalData.Dimensions.LookupArrays.All
\u2014 Type.
All <: Selector\n\nAll(selectors::Selector...)\n
Selector that combines the results of other selectors. The indices used will be the union of all result sorted in ascending order.
Example
using DimensionalData, Unitful\n\ndimz = X(10.0:20:200.0), Ti(1u\"s\":5u\"s\":100u\"s\")\nA = DimArray((1:10) * (1:20)', dimz)\nA[X=All(At(10.0), At(50.0)), Ti=All(1u\"s\"..10u\"s\", 90u\"s\"..100u\"s\")]\n\n# output\n\n2\u00d74 DimArray{Int64,2} with dimensions:\nX Sampled{Float64} Float64[10.0, 50.0] ForwardOrdered Regular Points,\nTi Sampled{Quantity{Int64, \ud835\udc13, Unitful.FreeUnits{(s,), \ud835\udc13, nothing}}} Quantity{Int64, \ud835\udc13, Unitful.FreeUnits{(s,), \ud835\udc13, nothing}}[1 s, 6 s, 91 s, 96 s] ForwardOrdered Regular Points\n1 s 6 s 91 s 96 s\n10.0 1 2 19 20\n50.0 3 6 57 60\n
source
Lookup properties:
# DimensionalData.Dimensions.LookupArrays.bounds
\u2014 Function.
bounds(xs, [dims::Tuple]) => Tuple{Vararg{Tuple{T,T}}}\nbounds(xs::Tuple) => Tuple{Vararg{Tuple{T,T}}}\nbounds(x, dim) => Tuple{T,T}\nbounds(dim::Union{Dimension,LookupArray}) => Tuple{T,T}\n
Return the bounds of all dimensions of an object, of a specific dimension, or of a tuple of dimensions.
If bounds are not known, one or both values may be nothing
.
dims
can be a Dimension
, a dimension type, or a tuple of either.
source
# DimensionalData.Dimensions.LookupArrays.val
\u2014 Function.
val(x)\nval(dims::Tuple) => Tuple\n
Return the contained value of a wrapper object.
dims
can be Dimension
, Dimension
types, or Symbols
for Dim{Symbol}
.
Objects that don't define a val
method are returned unaltered.
source
# DimensionalData.Dimensions.LookupArrays.LookupArray
\u2014 Type.
LookupArray\n
Types defining the behaviour of a lookup index, how it is plotted and how Selector
s like Between
work.
A LookupArray
may be NoLookup
indicating that the index is just the underlying array axis, Categorical
for ordered or unordered categories, or a Sampled
index for Points
or Intervals
.
source
# DimensionalData.Dimensions.LookupArrays.Aligned
\u2014 Type.
Aligned <: LookupArray\n
Abstract supertype for LookupArray
s where the index is aligned with the array axes.
This is by far the most common supertype for LookupArray
.
source
# DimensionalData.Dimensions.LookupArrays.AbstractSampled
\u2014 Type.
AbstractSampled <: Aligned\n
Abstract supertype for LookupArray
s where the index is aligned with the array, and is independent of other dimensions. Sampled
is provided by this package.
AbstractSampled
must have order
, span
and sampling
fields, or a rebuild
method that accpts them as keyword arguments.
source
# DimensionalData.Dimensions.LookupArrays.Sampled
\u2014 Type.
Sampled <: AbstractSampled\n\nSampled(data::AbstractVector, order::Order, span::Span, sampling::Sampling, metadata)\nSampled(; data=AutoIndex(), order=AutoOrder(), span=AutoSpan(), sampling=Points(), metadata=NoMetadata())\n
A concrete implementation of the LookupArray
AbstractSampled
. It can be used to represent Points
or Intervals
.
Sampled
is capable of representing gridded data from a wide range of sources, allowing correct bounds
and Selector
s for points or intervals of regular, irregular, forward and reverse indexes.
On AbstractDimArray
construction, Sampled
lookup is assigned for all lookups of AbstractRange
not assigned to Categorical
.
Arguments
data
: An AbstractVector
of index values, matching the length of the curresponding array axis. order
: Order
) indicating the order of the index, AutoOrder
by default, detected from the order of data
to be ForwardOrdered
, ReverseOrdered
or Unordered
. These can be provided explicitly if they are known and performance is important. span
: indicates the size of intervals or distance between points, and will be set to Regular
for AbstractRange
and Irregular
for AbstractArray
, unless assigned manually. sampling
: is assigned to Points
, unless set to Intervals
manually. Using Intervals
will change the behaviour of bounds
and Selectors
s to take account for the full size of the interval, rather than the point alone. metadata
: a Dict
or Metadata
wrapper that holds any metadata object adding more information about the array axis - useful for extending DimensionalData for specific contexts, like geospatial data in GeoData.jl. By default it is NoMetadata()
.
Example
Create an array with [Interval
] sampling, and Regular
span for a vector with known spacing.
We set the Locus
of the Intervals
to Start
specifying that the index values are for the positions at the start of each interval.
using DimensionalData, DimensionalData.LookupArrays\n\nx = X(Sampled(100:-20:10; sampling=Intervals(Start())))\ny = Y(Sampled([1, 4, 7, 10]; span=Regular(3), sampling=Intervals(Start())))\nA = ones(x, y)\n\n# output\n5\u00d74 DimArray{Float64,2} with dimensions:\nX Sampled{Int64} 100:-20:20 ReverseOrdered Regular Intervals,\nY Sampled{Int64} Int64[1, 4, 7, 10] ForwardOrdered Regular Intervals\n1 4 7 10\n100 1.0 1.0 1.0 1.0\n80 1.0 1.0 1.0 1.0\n60 1.0 1.0 1.0 1.0\n40 1.0 1.0 1.0 1.0\n20 1.0 1.0 1.0 1.0\n
source
# DimensionalData.Dimensions.LookupArrays.AbstractCategorical
\u2014 Type.
AbstractCategorical <: Aligned\n
LookupArray
s where the values are categories.
Categorical
is the provided concrete implementation. but this can easily be extended - all methods are defined for AbstractCategorical
.
All AbstractCategorical
must provide a rebuild
method with data
, order
and metadata
keyword arguments.
source
# DimensionalData.Dimensions.LookupArrays.Categorical
\u2014 Type.
Categorical <: AbstractCategorical\n\nCategorical(o::Order)\nCategorical(; order=Unordered())\n
An LookupArray where the values are categories.
This will be automatically assigned if the index contains AbstractString
, Symbol
or Char
. Otherwise it can be assigned manually.
Order
will be determined automatically where possible.
Arguments
data
: An AbstractVector
of index values, matching the length of the curresponding array axis. order
: Order
) indicating the order of the index, AutoOrder
by default, detected from the order of data
to be ForwardOrdered
, ReverseOrdered
or Unordered
. Can be provided if this is known and performance is important. metadata
: a Dict
or Metadata
wrapper that holds any metadata object adding more information about the array axis - useful for extending DimensionalData for specific contexts, like geospatial data in GeoData.jl. By default it is NoMetadata()
.
Example
Create an array with [Interval
] sampling.
using DimensionalData\n\nds = X([\"one\", \"two\", \"three\"]), Y([:a, :b, :c, :d])\nA = DimArray(rand(3, 4), ds)\nDimensions.lookup(A)\n\n# output\n\nCategorical{String} String[\"one\", \"two\", \"three\"] Unordered,\nCategorical{Symbol} Symbol[:a, :b, :c, :d] ForwardOrdered\n
source
# DimensionalData.Dimensions.LookupArrays.Unaligned
\u2014 Type.
Unaligned <: LookupArray\n
Abstract supertype for LookupArray
where the index is not aligned to the grid.
Indexing an Unaligned
with Selector
s must provide all other Unaligned
dimensions.
source
# DimensionalData.Dimensions.LookupArrays.Transformed
\u2014 Type.
Transformed <: Unaligned\n\nTransformed(f, dim::Dimension; metadata=NoMetadata())\n
LookupArray
that uses an affine transformation to convert dimensions from dims(lookup)
to dims(array)
. This can be useful when the dimensions are e.g. rotated from a more commonly used axis.
Any function can be used to do the transformation, but transformations from CoordinateTransformations.jl may be useful.
Arguments
f
: transformation function dim
: a dimension to transform to.
Keyword Arguments
metdata
:
Example
using DimensionalData, DimensionalData.LookupArrays, CoordinateTransformations\n\nm = LinearMap([0.5 0.0; 0.0 0.5])\nA = [1 2 3 4\n5 6 7 8\n9 10 11 12];\nda = DimArray(A, (t1=Transformed(m, X), t2=Transformed(m, Y)))\n\nda[X(At(6)), Y(At(2))]\n\n# output\n9\n
source
# DimensionalData.Dimensions.MergedLookup
\u2014 Type.
MergedLookup <: LookupArray\n\nMergedLookup(data, dims; [metadata])\n
A LookupArray
that holds multiple combined dimensions.
MergedLookup
can be indexed with Selector
s like At
, Between
, and Where
although Near
has undefined meaning.
Arguments
data
: A Vector
of Tuple
. dims
: A Tuple
of Dimension
indicating the dimensions in the tuples in data
.
Keywords
metadata
: a Dict
or Metadata
object to attach dimension metadata.
source
# DimensionalData.Dimensions.LookupArrays.NoLookup
\u2014 Type.
NoLookup <: LookupArray\n\nNoLookup()\n
A LookupArray
that is identical to the array axis. Selector
s can't be used on this lookup.
Example
Defining a DimArray
without passing an index to the dimensions, it will be assigned NoLookup
:
using DimensionalData\n\nA = DimArray(rand(3, 3), (X, Y))\nDimensions.lookup(A)\n\n# output\n\nNoLookup, NoLookup\n
Which is identical to:
using .LookupArrays\nA = DimArray(rand(3, 3), (X(NoLookup()), Y(NoLookup())))\nDimensions.lookup(A)\n\n# output\n\nNoLookup, NoLookup\n
source
# DimensionalData.Dimensions.LookupArrays.AutoLookup
\u2014 Type.
AutoLookup <: LookupArray\n\nAutoLookup()\nAutoLookup(index=AutoIndex(); kw...)\n
Automatic LookupArray
, the default lookup. It will be converted automatically to another LookupArray
when it is possible to detect it from the index.
Keywords will be used in the detected LookupArray
constructor.
source
# DimensionalData.Dimensions.LookupArrays.AutoIndex
\u2014 Type.
AutoIndex\n
Detect a LookupArray
index from the context. This is used in NoLookup
to simply use the array axis as the index when the array is constructed, and in set
to change the LookupArray
type without changing the index values.
source
"},{"location":"reference/#metadata","title":"Metadata","text":"# DimensionalData.Dimensions.LookupArrays.AbstractMetadata
\u2014 Type.
AbstractMetadata{X,T}\n
Abstract supertype for all metadata wrappers.
Metadata wrappers allow tracking the contents and origin of metadata. This can facilitate conversion between metadata types (for saving a file to a differenet format) or simply saving data back to the same file type with identical metadata.
Using a wrapper instead of Dict
or NamedTuple
also lets us pass metadata objects to set
without ambiguity about where to put them.
source
# DimensionalData.Dimensions.LookupArrays.Metadata
\u2014 Type.
Metadata <: AbstractMetadata\n\nMetadata{X}(val::Union{Dict,NamedTuple})\nMetadata{X}(pairs::Pair...) => Metadata{Dict}\nMetadata{X}(; kw...) => Metadata{NamedTuple}\n
General Metadata
object. The X
type parameter categorises the metadata for method dispatch, if required.
source
# DimensionalData.Dimensions.LookupArrays.NoMetadata
\u2014 Type.
NoMetadata <: AbstractMetadata\n\nNoMetadata()\n
Indicates an object has no metadata. But unlike using nothing
, get
, keys
and haskey
will still work on it, get
always returning the fallback argument. keys
returns ()
while haskey
always returns false
.
source
"},{"location":"reference/#lookuparray-traits","title":"LookupArray traits","text":"# DimensionalData.Dimensions.LookupArrays.LookupArrayTrait
\u2014 Type.
LookupArrayTrait\n
Abstract supertype of all traits of a LookupArray
.
These modify the behaviour of the lookup index.
The term \"Trait\" is used loosely - these may be fields of an object of traits hard-coded to specific types.
source
"},{"location":"reference/#order","title":"Order","text":"# DimensionalData.Dimensions.LookupArrays.Order
\u2014 Type.
Order <: LookupArrayTrait\n
Traits for the order of a LookupArray
. These determine how searchsorted
finds values in the index, and how objects are plotted.
source
# DimensionalData.Dimensions.LookupArrays.Ordered
\u2014 Type.
Ordered <: Order\n
Supertype for the order of an ordered LookupArray
, including ForwardOrdered
and ReverseOrdered
.
source
# DimensionalData.Dimensions.LookupArrays.ForwardOrdered
\u2014 Type.
ForwardOrdered <: Ordered\n\nForwardOrdered()\n
Indicates that the LookupArray
index is in the normal forward order.
source
# DimensionalData.Dimensions.LookupArrays.ReverseOrdered
\u2014 Type.
ReverseOrdered <: Ordered\n\nReverseOrdered()\n
Indicates that the LookupArray
index is in the reverse order.
source
# DimensionalData.Dimensions.LookupArrays.Unordered
\u2014 Type.
Unordered <: Order\n\nUnordered()\n
Indicates that LookupArray
is unordered.
This means the index cannot be searched with searchsortedfirst
or similar optimised methods - instead it will use findfirst
.
source
# DimensionalData.Dimensions.LookupArrays.AutoOrder
\u2014 Type.
AutoOrder <: Order\n\nAutoOrder()\n
Specifies that the Order
of a LookupArray
will be found automatically where possible.
source
"},{"location":"reference/#span","title":"Span","text":"# DimensionalData.Dimensions.LookupArrays.Span
\u2014 Type.
Span <: LookupArrayTrait\n
Defines the type of span used in a Sampling
index. These are Regular
or Irregular
.
source
# DimensionalData.Dimensions.LookupArrays.Regular
\u2014 Type.
Regular <: Span\n\nRegular(step=AutoStep())\n
Points
or Intervals
that have a fixed, regular step.
source
# DimensionalData.Dimensions.LookupArrays.Irregular
\u2014 Type.
Irregular <: Span\n\nIrregular(bounds::Tuple)\nIrregular(lowerbound, upperbound)\n
Points
or Intervals
that have an Irrigular
step size. To enable bounds tracking and accuract selectors, the starting bounds are provided as a 2 tuple, or 2 arguments. (nothing, nothing)
is acceptable input, the bounds will be guessed from the index, but may be innaccurate.
source
# DimensionalData.Dimensions.LookupArrays.Explicit
\u2014 Type.
Explicit(bounds::AbstractMatix)\n
Intervals where the span is explicitly listed for every interval.
This uses a matrix where with length 2 columns for each index value, holding the lower and upper bounds for that specific index.
source
# DimensionalData.Dimensions.LookupArrays.AutoSpan
\u2014 Type.
AutoSpan <: Span\n\nAutoSpan()\n
The span will be guessed and replaced in format
or set
.
source
"},{"location":"reference/#sampling","title":"Sampling","text":"# DimensionalData.Dimensions.LookupArrays.Sampling
\u2014 Type.
Sampling <: LookupArrayTrait\n
Indicates the sampling method used by the index: Points
or Intervals
.
source
# DimensionalData.Dimensions.LookupArrays.Points
\u2014 Type.
Points <: Sampling\n\nPoints()\n
Sampling
lookup where single samples at exact points.
These are always plotted at the center of array cells.
source
# DimensionalData.Dimensions.LookupArrays.Intervals
\u2014 Type.
Intervals <: Sampling\n\nIntervals(locus::Locus)\n
Sampling
specifying that sampled values are the mean (or similar) value over an interval, rather than at one specific point.
Intervals require a Locus
of Start
, Center
or End
to define the location in the interval that the index values refer to.
source
"},{"location":"reference/#loci","title":"Loci","text":"# DimensionalData.Dimensions.LookupArrays.Locus
\u2014 Type.
Locus <: LookupArrayTrait
Abstract supertype of types that indicate the position of index values where they represent Intervals
.
These allow for values array cells to align with the Start
, Center
, or End
of values in the lookup index.
This means they can be plotted with correct axis markers, and allows automatic converrsions to between formats with different standards (such as NetCDF and GeoTiff).
source
# DimensionalData.Dimensions.LookupArrays.Center
\u2014 Type.
Center <: Locus\n\nCenter()\n
Indicates a lookup value is for the center of its corresponding array cell.
source
# DimensionalData.Dimensions.LookupArrays.Start
\u2014 Type.
Start <: Locus\n\nStart()\n
Indicates a lookup value is for the start of its corresponding array cell, in the direction of the lookup index order.
source
# DimensionalData.Dimensions.LookupArrays.End
\u2014 Type.
End <: Locus\n\nEnd()\n
Indicates a lookup value is for the end of its corresponding array cell, in the direction of the lookup index order.
source
# DimensionalData.Dimensions.LookupArrays.AutoLocus
\u2014 Type.
AutoLocus <: Locus\n\nAutoLocus()\n
Indicates a interval where the index position is not yet known. This will be filled with a default value on object construction.
source
"},{"location":"reference/#lookuparrays-methods","title":"LookupArrays methods","text":"# DimensionalData.Dimensions.LookupArrays.hasselection
\u2014 Function.
hasselection(x, selector) => Bool\nhasselection(x, selectors::Tuple) => Bool\n
Check if indexing into x with selectors
can be performed, where x is some object with a dims
method, and selectors
is a Selector
or Dimension
or a tuple of either.
source
# DimensionalData.Dimensions.LookupArrays.shiftlocus
\u2014 Function.
shiftlocus(locus::Locus, x)\n
Shift the index of x
from the current locus to the new locus.
We only shift Sampled
, Regular
or Explicit
, Intervals
.
source
# DimensionalData.Dimensions.LookupArrays.sampling
\u2014 Function.
sampling(x, [dims::Tuple]) => Tuple\nsampling(x, dim) => Sampling\nsampling(xs::Tuple) => Tuple{Vararg{Sampling}}\nsampling(x:Union{Dimension,LookupArray}) => Sampling\n
Return the Sampling
for each dimension.
Second argument dims
can be Dimension
s, Dimension
types, or Symbols
for Dim{Symbol}
.
source
# DimensionalData.Dimensions.LookupArrays.span
\u2014 Function.
span(x, [dims::Tuple]) => Tuple\nspan(x, dim) => Span\nspan(xs::Tuple) => Tuple{Vararg{Span,N}}\nspan(x::Union{Dimension,LookupArray}) => Span\n
Return the Span
for each dimension.
Second argument dims
can be Dimension
s, Dimension
types, or Symbols
for Dim{Symbol}
.
source
# DimensionalData.Dimensions.LookupArrays.order
\u2014 Function.
order(x, [dims::Tuple]) => Tuple\norder(xs::Tuple) => Tuple\norder(x::Union{Dimension,LookupArray}) => Order\n
Return the Ordering
of the dimension index for each dimension: ForwardOrdered
, ReverseOrdered
, or Unordered
Second argument dims
can be Dimension
s, Dimension
types, or Symbols
for Dim{Symbol}
.
source
# DimensionalData.Dimensions.LookupArrays.index
\u2014 Function.
index(x) => Tuple{Vararg{AbstractArray}}\nindex(x, dims::Tuple) => Tuple{Vararg{AbstractArray}}\nindex(dims::Tuple) => Tuple{Vararg{AbstractArray}}}\nindex(x, dim) => AbstractArray\nindex(dim::Dimension) => AbstractArray\n
Return the contained index of a Dimension
.
Only valid when a Dimension
contains an AbstractArray
or a Val tuple like Val{(:a, :b)}()
. The Val
is unwrapped to return just the Tuple
dims
can be a Dimension
, or a tuple of Dimension
.
source
# DimensionalData.Dimensions.LookupArrays.locus
\u2014 Function.
locus(x, [dims::Tuple]) => Tuple\nlocus(x, dim) => Locus\nlocus(xs::Tuple) => Tuple{Vararg{Locus,N}}\nlocus(x::Union{Dimension,LookupArray}) => Locus\n
Return the Locus
for each dimension.
Second argument dims
can be Dimension
s, Dimension
types, or Symbols
for Dim{Symbol}
.
source
# DimensionalData.Dimensions.LookupArrays.units
\u2014 Function.
units(x) => Union{Nothing,Any}\nunits(xs:Tuple) => Tuple\nunit(A::AbstractDimArray, dims::Tuple) => Tuple\nunit(A::AbstractDimArray, dim) => Union{Nothing,Any}\n
Get the units of an array or Dimension
, or a tuple of of either.
Units do not have a set field, and may or may not be included in metadata
. This method is to facilitate use in labels and plots when units are available, not a guarantee that they will be. If not available, nothing
is returned.
Second argument dims
can be Dimension
s, Dimension
types, or Symbols
for Dim{Symbol}
.
source
"},{"location":"reference/#name","title":"Name","text":"# DimensionalData.AbstractName
\u2014 Type.
AbstractName\n
Abstract supertype for name wrappers.
source
# DimensionalData.Name
\u2014 Type.
Name <: AbstractName\n\nName(name::Union{Symbol,Name) => Name\nName(name::NoName) => NoName\n
Name wrapper. This lets arrays keep symbol names when the array wrapper neeeds to be `isbits, like for use on GPUs. It makes the name a property of the type. It's not necessary to use in normal use, a symbol is probably easier.
source
# DimensionalData.NoName
\u2014 Type.
NoName <: AbstractName\n\nNoName()\n
NoName specifies an array is not named, and is the default name
value for all AAbstractDimArray
s.
source
"},{"location":"crash/generated/course/course/","title":"Crash course","text":"using DimensionalData\n
"},{"location":"crash/generated/course/course/#dimensions-and-dimarrays","title":"Dimensions and DimArrays","text":"The core type of DimensionalData.jl is the Dimension
and the types that inherit from it, such as Ti
, X
, Y
, Z
, the generic Dim{:x}
, or others that you define manually using the @dim
macro.
Dimension
s are primarily used in DimArray
, other AbstractDimArray
.
We can use dimensions without a value index - these simply label the axis. A DimArray
with labelled dimensions is constructed by:
using DimensionalData\nA = rand(X(5), Y(5))\n
5\u00d75 DimArray{Float64,2} with dimensions: X, Y\n 0.124874 0.566452 0.913496 0.503004 0.943575\n 0.65846 0.145551 0.680193 0.767833 0.274717\n 0.754621 0.972466 0.757034 0.549937 0.0993212\n 0.856564 0.355987 0.283302 0.654112 0.311087\n 0.903285 0.856681 0.129552 0.112247 0.551085\n
get value
A[Y(1), X(2)]\n
0.6584600731758927\n
As shown above, Dimension
s can be used to construct arrays in rand
, ones
, zeros
and fill
with either a range for a lookup index or a number for the dimension length.
Or we can use the Dim{X}
dims by using Symbol
s, and indexing with keywords:
A = DimArray(rand(5, 5), (:a, :b))\n
5\u00d75 DimArray{Float64,2} with dimensions: Dim{:a}, Dim{:b}\n 0.699059 0.7846 0.668121 0.615491 0.777982\n 0.670299 0.894482 0.712696 0.742939 0.239314\n 0.499818 0.109764 0.0703531 0.495425 0.450842\n 0.302298 0.662751 0.0455818 0.506814 0.335471\n 0.370046 0.50841 0.350326 0.863748 0.295432\n
get value
A[a=3, b=5]\n
0.4508424181357401\n
Often, we want to provide a lookup index for the dimension:
using Dates\nt = DateTime(2001):Month(1):DateTime(2001,12)\nx = 10:10:100\nA = rand(X(x), Ti(t))\n
10\u00d712 DimArray{Float64,2} with dimensions: \n X Sampled{Int64} 10:10:100 ForwardOrdered Regular Points,\n Ti Sampled{DateTime} DateTime(\"2001-01-01T00:00:00\"):Month(1):DateTime(\"2001-12-01T00:00:00\") ForwardOrdered Regular Points\n 2001-01-01T00:00:00 \u2026 2001-12-01T00:00:00\n 10 0.542112 0.826426\n 20 0.0792752 0.647033\n 30 0.529978 0.178508\n 40 0.257827 0.00017745\n 50 0.143285 \u2026 0.869402\n 60 0.787206 0.0859712\n 70 0.125833 0.843983\n 80 0.00607514 0.792338\n 90 0.304529 0.29552\n 100 0.483298 \u2026 0.580883\n
Here both X
and Ti
are dimensions from DimensionalData
. The currently exported dimensions are X, Y, Z, Ti
(Ti
is shortening of Time
).
The length of each dimension index has to match the size of the corresponding array axis.
This can also be done with Symbol
, using Dim{X}
:
A2 = DimArray(rand(12, 10), (time=t, distance=x))\n
12\u00d710 DimArray{Float64,2} with dimensions: \n Dim{:time} Sampled{DateTime} DateTime(\"2001-01-01T00:00:00\"):Month(1):DateTime(\"2001-12-01T00:00:00\") ForwardOrdered Regular Points,\n Dim{:distance} Sampled{Int64} 10:10:100 ForwardOrdered Regular Points\n \u2026 80 90 100\n 2001-01-01T00:00:00 0.546073 0.776708 0.475906\n 2001-02-01T00:00:00 0.666282 0.248009 0.923467\n 2001-03-01T00:00:00 0.349775 0.883104 0.039746\n 2001-04-01T00:00:00 0.471359 0.63521 0.246456\n 2001-05-01T00:00:00 \u2026 0.770968 0.372262 0.548898\n 2001-06-01T00:00:00 0.340405 0.620083 0.562722\n 2001-07-01T00:00:00 0.468234 0.624977 0.351428\n 2001-08-01T00:00:00 0.865936 0.263336 0.482265\n 2001-09-01T00:00:00 0.483682 0.176646 0.978312\n 2001-10-01T00:00:00 \u2026 0.680192 0.973174 0.276208\n 2001-11-01T00:00:00 0.141882 0.0246634 0.768738\n 2001-12-01T00:00:00 0.469621 0.749869 0.515705\n
Symbols can be more convenient to use than defining custom dims with @dim
, but have some downsides. They don't inherit from a specific Dimension
type, so plots will not know what axis to put them on. They also cannot use the basic constructor methods like rand
or zeros
, as we cannot dispatch on Symbol
for Base methods without \"type-piracy\".
"},{"location":"crash/generated/course/course/#indexing-the-array-by-name-and-index","title":"Indexing the array by name and index","text":"Dimensions can be used to index the array by name, without having to worry about the order of the dimensions.
The simplest case is to select a dimension by index. Let's say every 2nd point of the Ti
dimension and every 3rd point of the X
dimension. This is done with the simple Ti(range)
syntax like so:
A[X(1:3:11), Ti(1:2:11)]\n
4\u00d76 DimArray{Float64,2} with dimensions: \n X Sampled{Int64} 10:30:100 ForwardOrdered Regular Points,\n Ti Sampled{DateTime} DateTime(\"2001-01-01T00:00:00\"):Month(2):DateTime(\"2001-11-01T00:00:00\") ForwardOrdered Regular Points\n 2001-01-01T00:00:00 \u2026 2001-11-01T00:00:00\n 10 0.542112 0.707524\n 40 0.257827 0.482177\n 70 0.125833 0.189332\n 100 0.483298 0.445263\n
When specifying only one dimension, all elements of the other dimensions are assumed to be included:
A[X(1:3:10)]\n
4\u00d712 DimArray{Float64,2} with dimensions: \n X Sampled{Int64} 10:30:100 ForwardOrdered Regular Points,\n Ti Sampled{DateTime} DateTime(\"2001-01-01T00:00:00\"):Month(1):DateTime(\"2001-12-01T00:00:00\") ForwardOrdered Regular Points\n 2001-01-01T00:00:00 \u2026 2001-12-01T00:00:00\n 10 0.542112 0.826426\n 40 0.257827 0.00017745\n 70 0.125833 0.843983\n 100 0.483298 0.580883\n
Indexing
Indexing AbstractDimArray
s works with getindex
, setindex!
and view
. The result is still an AbstracDimArray
, unless using all single Int
or Selector
s that resolve to Int
.
Dimension
s can be used to construct arrays in rand
, ones
, zeros
and fill
with either a range for a lookup index or a number for the dimension length.
using DimensionalData\nA1 = ones(X(1:40), Y(50))\n
40\u00d750 DimArray{Float64,2} with dimensions: \n X Sampled{Int64} 1:40 ForwardOrdered Regular Points,\n Y\n 1 1.0 1.0 1.0 1.0 1.0 1.0 1.0 \u2026 1.0 1.0 1.0 1.0 1.0 1.0 1.0\n 2 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0\n 3 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0\n 4 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0\n 5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0\n 6 1.0 1.0 1.0 1.0 1.0 1.0 1.0 \u2026 1.0 1.0 1.0 1.0 1.0 1.0 1.0\n \u22ee \u22ee \u22f1 \u22ee \u22ee \n 35 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0\n 36 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0\n 37 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0\n 38 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0\n 39 1.0 1.0 1.0 1.0 1.0 1.0 1.0 \u2026 1.0 1.0 1.0 1.0 1.0 1.0 1.0\n 40 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0\n
We can also use dim wrappers for indexing, so that the dimension order in the underlying array does not need to be known:
A1[Y(1), X(1:10)]\n
10-element DimArray{Float64,1} with dimensions: \n X Sampled{Int64} 1:10 ForwardOrdered Regular Points\nand reference dimensions: Y\n 1 1.0\n 2 1.0\n 3 1.0\n 4 1.0\n 5 1.0\n 6 1.0\n 7 1.0\n 8 1.0\n 9 1.0\n 10 1.0\n
"},{"location":"crash/generated/course/course/#indexing-performance","title":"Indexing Performance","text":"Indexing with Dimension
has no runtime cost:
A2 = ones(X(3), Y(3))\n
3\u00d73 DimArray{Float64,2} with dimensions: X, Y\n 1.0 1.0 1.0\n 1.0 1.0 1.0\n 1.0 1.0 1.0\n
time ?
using BenchmarkTools\n\nprintln(@btime $A2[X(1), Y(2)])\n
38.655 ns (0 allocations: 0 bytes)\n1.0\n
and
println(@btime parent($A2)[1, 2])\n
4.400 ns (0 allocations: 0 bytes)\n1.0\n
"},{"location":"crash/generated/course/course/#specifying-dims-keyword-arguments-with-dimension","title":"Specifying dims
keyword arguments with Dimension
","text":"In many Julia functions like size
or sum
, you can specify the dimension along which to perform the operation as an Int
. It is also possible to do this using Dimension
types with AbstractDimArray
:
A3 = rand(X(3), Y(4), Ti(5));\nsum(A3; dims=Ti)\n
3\u00d74\u00d71 DimArray{Float64,3} with dimensions: X, Y, Ti\n[:, :, 1]\n 2.5247 1.75441 2.19061 2.4184\n 0.868353 2.72675 3.0262 2.49353\n 2.18482 2.57632 1.92604 3.68636\n
This also works in methods from Statistics
:
using Statistics\nmean(A3; dims=Ti)\n
3\u00d74\u00d71 DimArray{Float64,3} with dimensions: X, Y, Ti\n[:, :, 1]\n 0.50494 0.350882 0.438123 0.483681\n 0.173671 0.54535 0.60524 0.498706\n 0.436964 0.515264 0.385208 0.737272\n
"},{"location":"crash/generated/course/course/#methods-where-dims-dim-types-or-symbols-can-be-used-to-indicate-the-array-dimension","title":"Methods where dims, dim types, or Symbol
s can be used to indicate the array dimension:","text":" size
, axes
, firstindex
, lastindex
cat
, reverse
, dropdims
reduce
, mapreduce
sum
, prod
, maximum
, minimum
, mean
, median
, extrema
, std
, var
, cor
, cov
permutedims
, adjoint
, transpose
, Transpose
mapslices
, eachslice
"},{"location":"crash/generated/course/course/#lookuparrays-and-selectors","title":"LookupArrays and Selectors","text":"Indexing by value in DimensionalData
is done with Selectors. IntervalSets.jl is now used for selecting ranges of values (formerly Between
).
Selector Description At(x)
get the index exactly matching the passed in value(s) Near(x)
get the closest index to the passed in value(s) Contains(x)
get indices where the value x falls within an interval Where(f)
filter the array axis by a function of the dimension index values. [Not(x)
] get all indices not selected by x
, which can be another selector. [a..b
] get all indices between two values, inclusively. [OpenInterval(a, b)
] get all indices between a
and b
, exclusively. [Interval{A,B}(a, b)
] get all indices between a
and b
, as :closed
or :open
. Selectors find indices in the LookupArray
, for each dimension. Here we use an Interval
to select a range between integers and DateTime
:
A[X(12..35), Ti(Date(2001, 5)..Date(2001, 7))]\n
2\u00d73 DimArray{Float64,2} with dimensions: \n X Sampled{Int64} 20:10:30 ForwardOrdered Regular Points,\n Ti Sampled{DateTime} DateTime(\"2001-05-01T00:00:00\"):Month(1):DateTime(\"2001-07-01T00:00:00\") ForwardOrdered Regular Points\n 2001-05-01T00:00:00 \u2026 2001-07-01T00:00:00\n 20 0.494727 0.543278\n 30 0.00466102 0.955162\n
To select intervals in DimArrays (e.g. A2
) you need to specify dimname=a .. b
:
A2[distance=12 .. 35, time=Date(2001, 5) .. Date(2001, 7)]\n
3\u00d73 DimArray{Float64,2} with dimensions: X, Y\n 1.0 1.0 1.0\n 1.0 1.0 1.0\n 1.0 1.0 1.0\n
Selectors can be used in getindex
, setindex!
and view
to select indices matching the passed in value(s)
We can use selectors inside dim wrappers, here selecting values from DateTime
and Int
:
using Dates\ntimespan = DateTime(2001,1):Month(1):DateTime(2001,12)\nA4 = rand(Ti(timespan), X(10:10:100))\nA4[X(Near(35)), Ti(At(DateTime(2001,5)))]\n
0.8201236140901906\n
Without dim wrappers selectors must be in the right order, and specify all axes:
using Unitful\nA5 = rand(Y((1:10:100)u\"m\"), Ti((1:5:100)u\"s\"));\nA5[10.5u\"m\" .. 50.5u\"m\", Near(23u\"s\")]\n
4-element DimArray{Float64,1} with dimensions: \n Y Sampled{Quantity{Int64, \ud835\udc0b, Unitful.FreeUnits{(m,), \ud835\udc0b, nothing}}} (11:10:41) m ForwardOrdered Regular Points\nand reference dimensions: \n Ti Sampled{Quantity{Int64, \ud835\udc13, Unitful.FreeUnits{(s,), \ud835\udc13, nothing}}} (21:5:21) s ForwardOrdered Regular Points\n 11 m 0.223668\n 21 m 0.737353\n 31 m 0.342295\n 41 m 0.550501\n
We can also use Linear indices as in standard Array
:
A5[1:5]\n
5-element Vector{Float64}:\n 0.8926603158925618\n 0.4029306517840252\n 0.22671898658265388\n 0.7936924607105116\n 0.008231268361020616\n
But unless the DimArray
is one dimensional, this will return a regular Array
. It is not possible to keep the LookupArray
or even Dimension
s after linear indexing is used.
"},{"location":"crash/generated/course/course/#lookuparrays-and-traits","title":"LookupArrays and traits","text":"Using a regular range or Vector
as a lookup index has a number of downsides. We cannot use searchsorted
for fast searches without knowing the order of the array, and this is slow to compute at runtime. It also means reverse
or rotations cannot be used while keeping the DimArray
wrapper.
Step sizes are also a problem. Some ranges like LinRange
lose their step size with a length of 1
. Often, instead of a range, multi-dimensional data formats provide a Vector
of evenly spaced values for a lookup, with a step size specified separately. Converting to a range introduces floating point errors that means points may not be selected with At
without setting tolerances.
This means using a lookup wrapper with traits is more generally robust and versatile than simply using a range or vector. DimensionalData provides types for specifying details about the dimension index, in the LookupArrays
sub-module:
using DimensionalData\nusing .LookupArrays\n
The main LookupArray
are :
Sampled
Categorical
, NoLookup
Each comes with specific traits that are either fixed or variable, depending on the contained index. These enable optimisations with Selector
s, and modified behaviours, such as:
- Selection of
Intervals
or Points
, which will give slightly
different results for selectors like ..
- as whole intervals are selected, and have different bounds
values.
- Tracking of lookup order. A reverse order is labelled
ReverseOrdered
and
will still work with searchsorted
, and for plots to always be the right way up when either the index or the array is backwards. Reversing a DimArray
will reverse the LookupArray
for that dimension, swapping ReverseOrdered
to ForwardOrdered
.
-
Sampled
Intervals
can have index located at a Locus
of:
-
Start
,
Center
End
Which specifies the point of the interval represented in the index, to match different data standards, e.g. GeoTIFF (Start
) and NetCDF (Center
).
- A
Span
specifies the gap between Points
or the size of
Intervals
. This may be:
Regular
, in the case of a range and equally spaced vector, Irregular
for unequally spaced vectors Explicit
for the case where all interval start and end points are specified explicitly - as is common in the NetCDF standard.
These traits all for subtypes of Aligned
.
Unaligned
also exists to handle dimensions with an index that is rotated or otherwise transformed in relation to the underlying array, such as Transformed
.
"},{"location":"crash/generated/course/course/#lookuparray-detection","title":"LookupArray detection","text":"Aligned
types will be detected automatically if not specified - which usually isn't required.
- An empty
Dimension
or a Type
or Symbol
will be assigned NoLookup
- this behaves as a simple named dimension without a lookup index. - A
Dimension
containing and index of String
, Char
, Symbol
or mixed types will be given the Categorical
mode, - A range will be assigned
Sampled
, defaulting to Regular
, Points
- Other
AbstractVector
will be assigned Sampled
Irregular
Points
.
In all cases the Order
of ForwardOrdered
or ReverseOrdered
will be be detected, otherwise Unordered
for an unsorted Array
.
See the LookupArray
API docs for more detail.
"},{"location":"crash/generated/course/course/#referenced-dimensions","title":"Referenced dimensions","text":"The reference dimensions record the previous dimensions that an array was selected from. These can be use for plot labelling, and tracking array changes so that cat
can reconstruct the lookup array from previous dimensions that have been sliced.
"},{"location":"crash/generated/course/course/#warnings","title":"Warnings","text":"Indexing with unordered or reverse-ordered arrays has undefined behaviour. It will trash the dimension index, break searchsorted
and nothing will make sense any more. So do it at you own risk.
However, indexing with sorted vectors of Int
can be useful, so it's allowed. But it may do strange things to interval sizes for Intervals
that are not Explicit
.
This selects the first 5 entries of the underlying array. In the case that A
has only one dimension, it will be retained. Multidimensional AbstracDimArray
indexed this way will return a regular array.
This page was generated using Literate.jl.
"}]}
\ No newline at end of file
diff --git a/previews/PR528/sitemap.xml.gz b/previews/PR528/sitemap.xml.gz
index 2627b51df..df539f510 100644
Binary files a/previews/PR528/sitemap.xml.gz and b/previews/PR528/sitemap.xml.gz differ