@@ -31,28 +31,23 @@ julia> fs = 40000 # Generate a 40kHz noisy signal, with spike-like stuff added f
31
31
end
32
32
33
33
julia> A = AxisArray ([y 2 y], Axis {:time} (0 s: 1 s/ fs: 60 s), Axis {:chan} ([:c1 , :c2 ]))
34
- 2400001 x2 AxisArrays. AxisArray{Float64,2 ,Array{Float64,2 },Tuple{AxisArrays. Axis{:time ,SIUnits. SIRange{FloatRange{Float64},Float64,0 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 }},AxisArrays. Axis{:chan ,Array{Symbol,1 }}}}:
35
- - 0.987931 - 1.97586
36
- - 0.719792 - 1.43958
37
- - 0.4038 - 0.8076
38
- - 1.12146 - 2.24293
39
- 3.31236 6.62473
40
- - 2.38934 - 4.77868
41
- - 3.65712 - 7.31424
42
- - 1.57186 - 3.14373
43
- - 3.89403 - 7.78806
44
- - 3.48901 - 6.97803
34
+ 2 - dimensional AxisArray{Float64,2 ,... } with axes:
35
+ :time , 0.0 s: 2.5e-5 s: 60.0 s
36
+ :chan , [:c1 ,:c2 ]
37
+ And data, a 2400001 x2 Array{Float64,2 }:
38
+ - 3.06091 - 6.12181
39
+ 0.152334 0.304668
40
+ 7.86831 15.7366
41
+ - 1.4144 - 2.82879
42
+ - 2.02881 - 4.05763
43
+ 9.87901 19.758
45
44
⋮
46
- 1.16204 2.32408
47
- 0.105888 0.211777
48
- - 4.5175 - 9.03501
49
- - 0.792749 - 1.5855
50
- 1.99229 3.98458
51
- 1.44092 2.88184
52
- - 1.06677 - 2.13353
53
- 3.03809 6.07619
54
- - 2.90052 - 5.80104
55
- - 0.519704 - 1.03941
45
+ - 0.0254444 - 0.0508888
46
+ 0.204358 0.408717
47
+ - 4.80093 - 9.60186
48
+ 5.39751 10.795
49
+ 0.976276 1.95255
50
+ 0.336558 0.673116
56
51
```
57
52
58
53
AxisArrays behave like regular arrays, but they additionally use the axis
@@ -61,16 +56,21 @@ indices in *any* order, just so long as we annotate them with the axis name:
61
56
62
57
``` jl
63
58
julia> A[Axis {:time} (4 )]
64
- 1 x2 AxisArrays. AxisArray{Float64,2 ,SubArray{Float64,2 ,Array{Float64,2 },Tuple{UnitRange{Int64},Colon},2 },Tuple{AxisArrays. Axis{:time ,SIUnits. SIRange{FloatRange{Float64},Float64,0 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 }},AxisArrays. Axis{:chan ,Array{Symbol,1 }}}}:
65
- - 1.12146 - 2.24293
59
+ 2 - dimensional AxisArray{Float64,2 ,... } with axes:
60
+ :time , 7.5e-5 s: 2.5e-5 s: 7.5e-5 s
61
+ :chan , [:c1 ,:c2 ]
62
+ And data, a 1 x2 SubArray{Float64,2 ,Array{Float64,2 },Tuple{UnitRange{Int64},Colon},2 }:
63
+ - 1.4144 - 2.82879
66
64
67
65
julia> A[Axis {:chan} (:c2 ), Axis {:time} (1 : 5 )]
68
- 5 - element AxisArrays. AxisArray{Float64,1 ,SubArray{Float64,1 ,Array{Float64,2 },Tuple{UnitRange{Int64},Int64},2 },Tuple{AxisArrays. Axis{:time ,SIUnits. SIRange{FloatRange{Float64},Float64,0 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 }}}}:
69
- - 1.97586
70
- - 1.43958
71
- - 0.8076
72
- - 2.24293
73
- 6.62473
66
+ 1 - dimensional AxisArray{Float64,1 ,... } with axes:
67
+ :time , 0.0 s: 2.5e-5 s: 0.0001 s
68
+ And data, a 5 - element SubArray{Float64,1 ,Array{Float64,2 },Tuple{UnitRange{Int64},Int64},2 }:
69
+ - 6.12181
70
+ 0.304668
71
+ 15.7366
72
+ - 2.82879
73
+ - 4.05763
74
74
```
75
75
76
76
We can also index by the * values* of each axis using an ` Interval ` type that
@@ -80,17 +80,19 @@ still has the correct time information for those datapoints!
80
80
81
81
``` jl
82
82
julia> A[40 µs .. 220 µs, :c1 ]
83
- 7 - element AxisArrays. AxisArray{Float64,1 ,SubArray{Float64,1 ,Array{Float64,2 },Tuple{UnitRange{Int64},Int64},2 },Tuple{AxisArrays. Axis{:time ,SIUnits. SIRange{FloatRange{Float64},Float64,0 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 }}}}:
84
- - 0.4038
85
- - 1.12146
86
- 3.31236
87
- - 2.38934
88
- - 3.65712
89
- - 1.57186
90
- - 3.89403
83
+ 1 - dimensional AxisArray{Float64,1 ,... } with axes:
84
+ :time , 5.0e-5 s: 2.5e-5 s: 0.0002 s
85
+ And data, a 7 - element SubArray{Float64,1 ,Array{Float64,2 },Tuple{UnitRange{Int64},Int64},2 }:
86
+ 7.86831
87
+ - 1.4144
88
+ - 2.02881
89
+ 9.87901
90
+ 0.463201
91
+ 2.49211
92
+ - 1.97716
91
93
92
94
julia> axes (ans, 1 )
93
- AxisArrays. Axis {:time,SIUnits.SIRange{FloatRange{Float64},Float64,0,0,1,0,0,0,0,0,0}} (5.0e-5 s: 2.5e-5 s: 0.00015 s)
95
+ AxisArrays. Axis {:time,SIUnits.SIRange{FloatRange{Float64},Float64,0,0,1,0,0,0,0,0,0}} (5.0e-5 s: 2.5e-5 s: 0.0002 s)
94
96
```
95
97
96
98
Sometimes, though, what we're really interested in is a window of time about a
@@ -101,14 +103,16 @@ we use the `atindex` function:
101
103
102
104
``` jl
103
105
julia> A[atindex (- 90 µs .. 90 µs, 5 ), :c2 ]
104
- 7 - element AxisArrays. AxisArray{Float64,1 ,SubArray{Float64,1 ,Array{Float64,2 },Tuple{UnitRange{Int64},Int64},2 },Tuple{AxisArrays. Axis{:time ,SIUnits. SIRange{FloatRange{Float64},Float64,0 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 }}}}:
105
- - 1.43958
106
- - 0.8076
107
- - 2.24293
108
- 6.62473
109
- - 4.77868
110
- - 7.31424
111
- - 3.14373
106
+ 1 - dimensional AxisArray{Float64,1 ,... } with axes:
107
+ :time , SIUnits. SIQuantity{Float64,0 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 }[5.0e-5 s,7.5e-5 s,0.0001 s,0.000125 s,0.00015 s,0.000175 s,0.0002 s]
108
+ And data, a 7 - element SubArray{Float64,1 ,Array{Float64,2 },Tuple{AxisArrays. AxisArray{Int64,1 ,UnitRange{Int64},Tuple{AxisArrays. Axis{:sub ,SIUnits. SIRange{FloatRange{Float64},Float64,0 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 }}}},Int64},0 }:
109
+ 15.7366
110
+ - 2.82879
111
+ - 4.05763
112
+ 19.758
113
+ 0.926402
114
+ 4.98423
115
+ - 3.95433
112
116
```
113
117
114
118
This simple concept can be extended to some very powerful behaviors. For
@@ -117,31 +121,26 @@ crossings.
117
121
118
122
``` jl
119
123
julia> idxs = find (diff (A[:,:c1 ] .< - 15 ) .> 0 )
120
- 248 - element Array{Int64,1 }: ...
124
+ 242 - element Array{Int64,1 }: ...
121
125
122
126
julia> spks = A[atindex (- 200 µs .. 800 µs, idxs), :c1 ]
123
- 39 x248 AxisArrays. AxisArray{Float64,2 ,Array{Float64,2 },Tuple{AxisArrays. Axis{:time_sub ,SIUnits. SIRange{FloatRange{Float64},Float64,0 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 }},AxisArrays. Axis{:time_rep ,Array{SIUnits. SIQuantity{Float64,0 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 },1 }}}}:
124
- 3.76269 3.20058 6.30581 … 9.6313 9.05193 0.214391
125
- 1.63657 3.26572 5.48104 1.4864 1.44608 6.1742
126
- 2.18868 5.87366 1.254 0.191431 1.69441 0.998004
127
- 3.8641 0.626106 0.147373 - 1.66639 - 2.91957 6.63631
128
- - 3.89523 - 2.43706 2.54553 1.7135 - 2.62467 - 3.57186
129
- - 6.34036 - 0.208273 2.06302 … - 5.43846 - 5.53668 - 6.3077
130
- - 14.6912 - 3.3506 - 7.20661 - 9.52052 - 7.66351 - 10.9802
131
- - 26.3792 - 16.0027 - 20.6367 - 16.4083 - 17.2507 - 23.289
132
- - 31.6724 - 25.7845 - 19.683 - 21.5722 - 26.4421 - 27.0657
133
- - 40.0827 - 29.7741 - 29.1362 - 31.2018 - 33.5294 - 28.8294
134
- ⋮ ⋱ ⋮
135
- 2.65848 4.67792 2.62444 8.10507 0.972752 0.57176
136
- - 0.735043 7.30589 2.10037 … 4.99347 7.31926 - 3.97361
137
- 1.91337 - 4.53805 - 3.3277 7.25753 1.24124 1.52025
138
- 4.52168 - 1.21125 0.763654 - 2.29234 - 2.35595 - 2.28334
139
- 1.48209 - 0.79957 - 6.21036 4.92486 - 1.56463 - 3.57588
140
- - 3.5987 1.98851 1.0221 - 4.33494 3.96454 0.522113
141
- - 0.109871 3.17695 1.62774 … 0.998204 0.441668 6.64595
142
- 5.56824 0.0631867 2.73849 1.53731 - 4.08166 4.67527
143
- - 1.43892 - 5.00031 1.36733 3.70478 - 0.25762 - 1.40656
144
- 0.76075 3.90081 - 4.59973 - 2.91403 0.830114 - 1.92139
127
+ 2 - dimensional AxisArray{Float64,2 ,... } with axes:
128
+ :time_sub , - 0.000175 s: 2.5e-5 s: 0.000775 s
129
+ :time_rep , SIUnits. SIQuantity{Float64,0 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 }[0.178725 s,0.806825 s,0.88305 s,1.47485 s,1.50465 s,1.53805 s,1.541025 s,2.16365 s,2.368425 s,2.739 s … 57.797925 s,57.924075 s,58.06075 s,58.215125 s,58.6403 s,58.96215 s,58.990225 s,59.001325 s,59.48395 s,59.611525 s]
130
+ And data, a 39 x242 Array{Float64,2 }:
131
+ - 1.53038 4.72882 5.8706 … - 0.231564 0.624714 3.44076
132
+ - 2.24961 2.12414 5.69936 7.00179 2.30993 5.20432
133
+ 5.96311 3.9713 - 4.38335 1.32617 - 0.686648 0.443454
134
+ 3.86592 5.7466 2.32469 1.30803 3.44585 1.17781
135
+ 3.56837 - 3.32178 1.16106 - 3.91796 2.41779 - 6.17495
136
+ - 9.52063 - 2.07014 - 1.18463 … - 3.55719 2.23117 1.76089
137
+ ⋮ ⋱ ⋮
138
+ 3.51708 - 1.63627 0.281915 - 2.41759 3.39403 0.101004
139
+ 0.0421772 - 2.13557 - 4.71965 0.066912 3.25141 - 0.445574
140
+ 3.53238 - 3.72221 1.68314 … - 4.15147 - 5.25241 - 1.77557
141
+ - 4.38307 1.38275 - 1.33641 3.40342 0.272826 - 3.22013
142
+ 2.54846 - 0.0194032 2.58679 - 0.000676503 - 2.71147 - 0.288483
143
+ 0.260694 - 4.1724 - 0.111377 3.283 1.77147 - 0.367888
145
144
```
146
145
147
146
By indexing with a repeated interval, we have * added* a dimension to the
@@ -158,16 +157,17 @@ julia> using Sparklines
158
157
print (t[i], " :\t " )
159
158
sparkln (spks[:, i])
160
159
end
161
- 0.37735 s: ▆▆▆▆▅▅▄▃▂▁▁▁▁▁▂▃▄▅▅▆▆▇▇█▇▇▇▇▆▆▅▆▆▆▅▅▆▅▆
162
- 0.79485 s: ▆▆▆▆▅▆▅▄▃▃▂▁▁▁▂▂▃▄▄▆▆▆▇▇█▇▇▇▇▆▆▅▆▆▆▆▆▅▆
163
- 0.8388 s: ▄▄▄▄▄▄▃▁▁▁▁▁▃▄▆█▆▆▄▃▃▄▃▄▃▄▃▄▄▄▄▃▄▃▄▄▄▄▃
164
- 1.05005 s: ▅▆▅▅▆▅▄▄▃▃▂▁▁▁▂▃▃▄▅▅▆▆▇▇▇▇▇█▆▆▆▅▅▆▆▆▅▅▆
165
- 1.11805 s: ▄▄▅▄▄▃▂▂▁▁▁▃▄▇█▇▆▅▄▄▄▄▄▄▄▄▄▄▄▃▃▄▄▃▃▄▄▄▄
166
- 1.245175 s: ▄▄▅▄▄▃▃▂▂▁▁▁▂▅█▇▆▆▅▄▄▄▄▃▃▄▃▄▄▄▄▃▄▃▄▃▄▄▄
167
- 1.245225 s: ▅▄▄▃▃▂▂▁▁▁▂▅█▇▆▆▅▄▄▄▄▃▃▄▃▄▄▄▄▃▄▃▄▃▄▄▄▄▄
168
- 1.534675 s: ▆▆▆▆▆▅▅▄▃▂▂▁▁▁▂▂▃▄▄▆▆▇▇▇▇█▇▇▇▆▇▆▆▆▅▆▆▆▆
169
- 1.73505 s: ▄▄▅▄▃▃▂▂▁▁▁▃▄▆█▇▆▅▄▄▄▄▅▄▄▄▄▄▄▄▄▄▄▄▃▄▄▄▄
170
- 2.3224 s: ▄▄▅▅▄▄▄▂▂▁▁▁▄▅▇▇█▆▅▄▄▄▄▄▄▄▄▄▅▅▄▅▄▄▅▅▄▄▄
160
+ d
161
+ 0.178725 s: ▄▄▅▄▄▃▃▂▁▁▂▃▅▆█▇▇▅▄▄▄▄▄▄▄▄▄▄▄▄▄▄▅▄▄▄▄▄▄
162
+ 0.806825 s: ▄▄▄▄▃▄▃▂▁▁▁▃▄▇█▇▆▅▄▃▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▃▄▄▃
163
+ 0.88305 s: ▆▆▅▆▆▅▄▄▃▂▁▁▁▁▂▂▃▄▄▅▇▆▇▇▇▇▇█▆▆▆▆▆▆▅▆▅▆▅
164
+ 1.47485 s: ▅▆▆▆▅▅▄▃▂▁▁▁▁▁▂▂▄▅▅▇▇▇▇▇▇█▆▇▆▆▆▆▆▆▆▆▆▆▅
165
+ 1.50465 s: ▄▄▄▄▃▃▂▁▁▁▁▃▄▆█▇▆▅▃▃▃▃▃▄▄▄▄▄▄▄▄▄▃▃▄▄▄▄▄
166
+ 1.53805 s: ▄▃▄▄▄▃▃▂▁▁▁▂▅▆▇█▆▅▃▄▄▄▄▃▄▄▄▄▃▄▄▄▄▄▄▄▄▄▄
167
+ 1.541025 s: ▆▆▆▆▆▄▄▄▃▂▂▁▁▁▂▂▃▄▅▅▆▆▇▇▇▇█▆▆▆▆▅▅▅▅▅▅▆▅
168
+ 2.16365 s: ▄▄▅▄▄▃▂▁▁▁▁▃▅▇█▇▆▅▅▄▄▄▄▄▃▄▄▄▄▄▄▄▄▄▄▄▄▄▃
169
+ 2.368425 s: ▆▆▆▆▅▅▄▃▂▁▁▁▁▂▂▃▄▅▆▆▇▇▇▇▇▇█▆▆▆▆▆▆▆▆▆▆▆▅
170
+ 2.739 s: ▆▆▅▆▅▄▅▄▃▃▂▁▁▁▁▂▃▄▅▅▆▇▇▇█▇▇▆▆▆▆▅▆▅▆▅▆▇▅
171
171
```
172
172
173
173
Fancier integration with plotting packages is a WIP.
0 commit comments