rafaqz / DimensionalData.jl

Named dimensions and indexing for julia arrays and other data
https://rafaqz.github.io/DimensionalData.jl/stable/
MIT License
262 stars 38 forks source link

Feature Request: pass fill value (single element) to `DimArray` #718

Closed alex-s-gardner closed 1 month ago

alex-s-gardner commented 1 month ago

This is a typical pattern when I work with DimensionalData:

d1 = Dim{:d1}(1:10)
d2 = Dim{:d2}('a':'f')
d3 = Dim{:d2}(["cat", "dog"])

DimArray(fill(NaN, length(d1),length(d2), length(d3)), (d1,d2,d3))

it seems fill(NaN, length(d1),length(d2), length(d3)) could be handled internally when a single element is passed to DimArray... so the above would become:

d1 = Dim{:d1}(1:10)
d2 = Dim{:d2}('a':'f')
d3 = Dim{:d2}(["cat", "dog"])

DimArray(NaN, (d1,d2,d3))

which is much easier to read

rafaqz commented 1 month ago

How about:

fill(NaN, (d1,d2,d3))

Try it ;)

alex-s-gardner commented 1 month ago

It's almost like someone had already thought of, and documented, this... works like a charm

d1 = Dim{:d1}(["🤦", "🤡", "😳"])
d2 = Dim{:d2}('a':'f')

fill(NaN, (d1,d2))
╭─────────────────────────╮
│ 3×6 DimArray{Float64,2} │
├─────────────────────────┴───────────────────────────── dims ┐
  ↓ d1 Categorical{String} ["🤦", "🤡", "😳"] ReverseOrdered,
  → d2 Categorical{Char} 'a':1:'f' ForwardOrdered
└─────────────────────────────────────────────────────────────┘
 ↓ →       'a'     'b'     'c'     'd'     'e'     'f'
  "🤦"  NaN     NaN     NaN     NaN     NaN     NaN
  "🤡"  NaN     NaN     NaN     NaN     NaN     NaN
  "😳"  NaN     NaN     NaN     NaN     NaN     NaN
lazarusA commented 1 month ago

PR this 😉

alex-s-gardner commented 1 month ago

@lazarusA are you thinking we should add support for:

DimArray(NaN, (d1,d2))

or do we just stick with what's already supported?

fill(NaN, (d1,d2))
asinghvi17 commented 1 month ago
julia> using OffsetArrays

julia> fill(NaN, -10:10, 1:10)
21×10 OffsetArray(::Matrix{Float64}, -10:10, 1:10) with eltype Float64 with indices -10:10×1:10:
 NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
 NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
 NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
 NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
 NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
 NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
 NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
 NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
 NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
   ⋮                        ⋮
 NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
 NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
 NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
 NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
 NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
 NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
 NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
 NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
 NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN

so I would suggest the second one :)

lazarusA commented 1 month ago

I like the fill method. Although, I will prefer the use of FillArrays package for that or similar, so that we don't actually allocate that much. In yax, we use them like this .

rafaqz commented 1 month ago

It already works :)

alex-s-gardner commented 1 month ago

OK we're all in agreement then, DimensionalData rocks as is