Skip to content

Commit

Permalink
Add methods for reverse (#89)
Browse files Browse the repository at this point in the history
* add reverse

* skip a test

* fix 1.3

* LTS is 1.6 now
  • Loading branch information
mcabbott authored Jan 19, 2022
1 parent edb9935 commit b14fd69
Show file tree
Hide file tree
Showing 5 changed files with 27 additions and 6 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
fail-fast: false
matrix:
version:
- '1.3'
- '1.6'
- '1' # Leave this line unchanged. '1' will automatically expand to the latest stable 1.x release of Julia.
- 'nightly'
os:
Expand Down
4 changes: 2 additions & 2 deletions Project.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name = "AxisKeys"
uuid = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5"
license = "MIT"
version = "0.1.25"
version = "0.1.26"

[deps]
AbstractFFTs = "621f4979-c628-5d54-868e-fcf4e3e8185c"
Expand Down Expand Up @@ -31,7 +31,7 @@ NamedDims = "0.2.45"
OffsetArrays = "0.10, 0.11, 1.0"
StatsBase = "0.32, 0.33"
Tables = "0.2, 1"
julia = "1"
julia = "1.6"

[extras]
BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf"
Expand Down
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -137,8 +137,9 @@ The following things should work:
* Reductions like `sum(A; dims=:channel)` can use dimension names.
Likewise `prod`, `mean` etc., and `dropdims`.

* Sorting: `sortslices` permutes keys & data by the array,
while `sortkeys` goes by the keys.
* Sorting: `sort` and `sortslices` permute keys & data by the array,
while a new function `sortkeys` goes by the keys.
`reverse` similarly re-orders keys to match data.

* Some linear algebra functions like `*` and `\` will work.

Expand Down
7 changes: 7 additions & 0 deletions src/functions.jl
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,13 @@ for T in [ :(AbstractVector{<:KeyedVecOrMat}),
end
end

function Base.reverse(A::KeyedArray; dims = ntuple(identity, ndims(A)))
dims′ = NamedDims.dim(A, dims)
data = reverse(parent(A); dims=dims′)
new_keys = ntuple(d -> d in dims′ ? reverse(axiskeys(A,d)) : copy(axiskeys(A,d)), ndims(A))
KeyedArray(data, new_keys) # , copy(A.meta))
end

function Base.sort(A::KeyedArray; dims, kw...)
dims′ = NamedDims.dim(A, dims)
data = sort(parent(A); dims=dims′, kw...)
Expand Down
15 changes: 14 additions & 1 deletion test/_functions.jl
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ end
@test std(m; corrected=false) == std([1, 2, 3]; corrected=false)

end
@testset "sort" begin
@testset "sort & reverse" begin

@test sort(V)(20) == V(20)

Expand Down Expand Up @@ -102,6 +102,19 @@ end
@test B′ == B[:,p]
@test issorted(reverse(B′.🏛))

# reverse
@test parent(parent(reverse(V))) == reverse(parent(parent(V)))
@test parent(parent(reverse(B))) == reverse(parent(parent(B)))
if AxisKeys.nameouter()
@test_broken axiskeys(reverse(V),1) == 100:-10:10
@test_broken parent(parent(reverse(B, dims=:🏛))) == reverse(parent(parent(B)), dims=2)
else
# Handled by Base's fallback, doesn't touch key vector:
@test axiskeys(reverse(V),1) == 100:-10:10
# This throws: reverse(NamedDimsArray(rand(3), a=[1,10,100]), dims=:a)
@test parent(parent(reverse(B, dims=:🏛))) == reverse(parent(parent(B)), dims=2)
@test axiskeys(reverse(B, dims=:🏛)) == (axiskeys(B,1), reverse(axiskeys(B,2)))
end
end
@testset "map & collect" begin

Expand Down

0 comments on commit b14fd69

Please sign in to comment.