Skip to content

Commit a75e3e3

Browse files
authored
Update readme (#277)
* update readme * center align table elements
1 parent 4959bab commit a75e3e3

File tree

1 file changed

+98
-12
lines changed

1 file changed

+98
-12
lines changed

README.md

Lines changed: 98 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,24 @@
11
# OffsetArrays.jl
22

3-
[![][action-img]][action-url]
4-
[![][pkgeval-img]][pkgeval-url]
5-
[![][codecov-img]][codecov-url]
6-
[![][docs-stable-img]][docs-stable-url]
7-
[![][docs-dev-img]][docs-dev-url]
3+
| Documentation (stable) | Documentation (dev) | Unit Tests | Code coverage | PkgEval |
4+
| :-: | :-: | :-: | :-: | :-: |
5+
| [![][docs-stable-img]][docs-stable-url] | [![][docs-dev-img]][docs-dev-url] | [![][action-img]][action-url] | [![][codecov-img]][codecov-url] | [![][pkgeval-img]][pkgeval-url] |
86

7+
## Introduction
98

109
OffsetArrays provides Julia users with arrays that have arbitrary
1110
indices, similar to those found in some other programming languages
1211
like Fortran.
1312

13+
An `OffsetArray` is a lightweight wrapper around an `AbstractArray` that shifts its indices.
14+
Generally, indexing into an `OffsetArray` should be as performant as the parent array.
15+
1416
## Usage
1517

16-
You can construct such arrays as follows:
18+
There are two ways to construct `OffsetArray`s: by specifying the axes of the array, or
19+
by specifying its origin.
20+
21+
The first way to construct an `OffsetArray` by specifying its axes is:
1722

1823
```julia
1924
OA = OffsetArray(A, axis1, axis2, ...)
@@ -30,20 +35,101 @@ julia> A = Float64.(reshape(1:15, 3, 5))
3035
2.0 5.0 8.0 11.0 14.0
3136
3.0 6.0 9.0 12.0 15.0
3237

33-
julia> OA = OffsetArray(A, -1:1, 0:4) # OA will have axes (-1:1, 0:4)
38+
julia> axes(A) # indices of a Matrix start from 1 along each axis
39+
(Base.OneTo(3), Base.OneTo(5))
40+
41+
julia> OA = OffsetArray(A, -1:1, 0:4) # OA will have the axes (-1:1, 0:4)
3442
3×5 OffsetArray(::Matrix{Float64}, -1:1, 0:4) with eltype Float64 with indices -1:1×0:4:
3543
1.0 4.0 7.0 10.0 13.0
3644
2.0 5.0 8.0 11.0 14.0
3745
3.0 6.0 9.0 12.0 15.0
3846

39-
julia> OA = OffsetArray(A, CartesianIndex(-1, 0):CartesianIndex(1, 4))
40-
3×5 OffsetArray(::Matrix{Float64}, -1:1, 0:4) with eltype Float64 with indices -1:1×0:4:
41-
[...]
47+
julia> OA[-1,0]
48+
1.0
49+
50+
julia> OA[1,4]
51+
15.0
52+
```
53+
54+
The second way to construct an `OffsetArray` is by specifying the origin, that is, the first index
55+
along each axis. This is particularly useful if one wants, eg., arrays that are 0-indexed as opposed
56+
to 1-indexed.
57+
58+
A convenient way to construct an `OffsetArray` this way is by using `OffsetArrays.Origin`:
59+
60+
```julia
61+
julia> using OffsetArrays: Origin
62+
63+
julia> Origin(0)(A) # indices begin at 0 along all axes
64+
3×5 OffsetArray(::Matrix{Float64}, 0:2, 0:4) with eltype Float64 with indices 0:2×0:4:
65+
1.0 4.0 7.0 10.0 13.0
66+
2.0 5.0 8.0 11.0 14.0
67+
3.0 6.0 9.0 12.0 15.0
68+
69+
julia> Origin(2, 3)(A) # indices begin at 2 along the first axis and 3 along the second
70+
3×5 OffsetArray(::Matrix{Float64}, 2:4, 3:7) with eltype Float64 with indices 2:4×3:7:
71+
1.0 4.0 7.0 10.0 13.0
72+
2.0 5.0 8.0 11.0 14.0
73+
3.0 6.0 9.0 12.0 15.0
74+
```
75+
76+
While the examples here refer to the common case where the parent arrays have indices starting at 1,
77+
this is not necessary. An `OffsetArray` may wrap any array that has integer indices, irrespective of
78+
where the indices begin.
4279

43-
julia> OA[-1,0], OA[1,4]
44-
(1.0, 15.0)
80+
## How to go back to 1-indexed arrays
81+
82+
Certain libraries, such as `LinearAlgebra`, require arrays to be indexed from 1. Passing an `OffsetArray`
83+
with shifted indices would lead to an error here.
84+
85+
```julia
86+
julia> A = Float64.(reshape(1:16, 4, 4));
87+
88+
julia> AO = Origin(0)(A);
89+
90+
julia> using LinearAlgebra
91+
92+
julia> Diagonal(AO)
93+
ERROR: ArgumentError: offset arrays are not supported but got an array with index other than 1
94+
```
95+
96+
The way to obtain a `1`-indexed array from an `OffsetArray` is by using `OffsetArrays.no_offset_view`.
97+
98+
An example of this is:
99+
100+
```julia
101+
julia> OffsetArrays.no_offset_view(AO)
102+
4×4 Matrix{Float64}:
103+
1.0 5.0 9.0 13.0
104+
2.0 6.0 10.0 14.0
105+
3.0 7.0 11.0 15.0
106+
4.0 8.0 12.0 16.0
107+
```
108+
109+
This may now be passed to `LinearAlgebra`:
110+
111+
```julia
112+
julia> D = Diagonal(OffsetArrays.no_offset_view(AO))
113+
4×4 Diagonal{Float64, Vector{Float64}}:
114+
1.0
115+
6.0
116+
11.0
117+
16.0
45118
```
46119

120+
If we want to restore the original indices of `AO`, we may wrap an `OffsetArray` around the `Diagonal` as:
121+
122+
```julia
123+
julia> Origin(AO)(D)
124+
4×4 OffsetArray(::Diagonal{Float64, Vector{Float64}}, 0:3, 0:3) with eltype Float64 with indices 0:3×0:3:
125+
1.0
126+
6.0
127+
11.0
128+
16.0
129+
```
130+
131+
Here, `Origin(AO)` is able to automatically infer and use the indices of `AO`.
132+
47133
<!-- badges -->
48134

49135
[pkgeval-img]: https://juliaci.github.io/NanosoldierReports/pkgeval_badges/O/OffsetArrays.svg

0 commit comments

Comments
 (0)