sijo
February 16, 2024, 8:49am
1
Let’s say I have a vector a = [x1, x2, x3, q1, q2, q3, q4]
. What’s a nice way to use it in algorithms that expect a flat vector like that, but at the same time have a nice interface like a.x
, a.q
to extract [x1, x2, x3]
and [q1, q2, q3, q4]
?
I thought of
a = NamedArray(VectorOfVectors([[1,2,3], [1,2,3,4]]), [:x, :q])
but that requires writing a[:x]
instead of a.x
, and flatview(a.array)[i]
instead of a[i]
.
jar1
February 16, 2024, 8:52am
2
There are packages that convert back and forth between struct and vector.
ParameterHandling.jl, TransformVariables.jl, Bijectors.jl, Flatten.jl, etc
2 Likes
sijo
February 19, 2024, 1:17pm
3
Thanks. It seems there’s room for another small package to provide named views to sections of an existing vector…
tbeason
February 19, 2024, 2:13pm
4
This is sort of what StructArrays.jl does?
sijo
February 19, 2024, 2:38pm
5
StructArrays is for a quite different use case I think:
each column with the same number of elements
columns can be of different types
data collected in StructArray columns
convenient constructors for vector of named tuples and list of columns
I’m looking for an interface to different sections of a vector:
sections can have different lengths
all values of the same type
all data stored together as a single vector
convenient constructor for named sections
For example, it could be a lightweight wrapper that works like this:
a = [x1, x2, x3, q1, q2, q3, q4]
a2 = Sections(a, x=1:3, q=4:7)
a2[1] # a[1] (getindex simply forwards to `a`)
a2.x # view(a, 1:3)
a2.q # view(a, 4:7)
1 Like
Thanks. It seems there’s room for another small package to provide named views to sections of an existing vector…
This is what ComponentArrays was designed for.
You can do
using ComponentArrays
a = ComponentArray(x = [1, 2, 3], q = [1, 2, 3, 4])
# Access position component
a.x
# Access quaternion component
a.q
See this example for how you can use ComponentArrays for simulating hierarchical models.
3 Likes
jling
February 19, 2024, 3:59pm
7
Are you looking for GitHub - JuliaHEP/AwkwardArray.jl: Awkward Array in Julia mirrors the Python library, enabling effortless zero-copy data exchange between Julia and Python ? it’s nowhere near completion yet but maybe you come from Python’s GitHub - scikit-hep/awkward: Manipulate JSON-like data with NumPy-like idioms.
In [8]: array = ak.Array([
...: [{"x": 1.1, "y": [1]}, {"x": 2.2, "y": [2, 2]}],
...: [],
...: [{"x": 3.3, "y": [3, 3, 3]}]
...: ])
In [9]: array.x
Out[9]: <Array [[1.1, 2.2], [], [3.3]] type='3 * var * float64'>
In [10]: array.y
Out[10]: <Array [[[1], [2, 2]], [], [[3, 3, 3]]] type='3 * var * var * int64'>
1 Like
sijo
February 19, 2024, 4:38pm
8
Thanks, ComponentArrays is exactly what I had in mind. You can even do the following:
a = ComponentArray([1,2,3,1,2,3,4], Axis(x=1:3, q=4:7))
which is very close to the API I had imagined
1 Like