@@ -280,6 +280,55 @@ Base.similar{S}(A::AxisArray, ::Type{S}, ax1::Axis, axs::Axis...) = similar(A, S
280
280
end
281
281
end
282
282
283
+ # These methods allow us to preserve the AxisArray under reductions
284
+ # Note that we only extend the following two methods, and then have it
285
+ # dispatch to package-local `reduced_indices` and `reduced_indices0`
286
+ # methods. This avoids a whole slew of ambiguities.
287
+ Base. reduced_indices (A:: AxisArray , region) = reduced_indices (axes (A), region)
288
+ Base. reduced_indices0 (A:: AxisArray , region) = reduced_indices0 (axes (A), region)
289
+
290
+ reduced_indices {N} (axs:: Tuple{Vararg{Axis,N}} , :: Tuple{} ) = axs
291
+ reduced_indices0 {N} (axs:: Tuple{Vararg{Axis,N}} , :: Tuple{} ) = axs
292
+ reduced_indices {N} (axs:: Tuple{Vararg{Axis,N}} , region:: Integer ) =
293
+ reduced_indices (axs, (region,))
294
+ reduced_indices0 {N} (axs:: Tuple{Vararg{Axis,N}} , region:: Integer ) =
295
+ reduced_indices0 (axs, (region,))
296
+
297
+ reduced_indices {N} (axs:: Tuple{Vararg{Axis,N}} , region:: Dims ) =
298
+ map ((ax,d)-> d∈ region ? reduced_axis (ax) : ax, axs, ntuple (identity, Val{N}))
299
+ reduced_indices0 {N} (axs:: Tuple{Vararg{Axis,N}} , region:: Dims ) =
300
+ map ((ax,d)-> d∈ region ? reduced_axis0 (ax) : ax, axs, ntuple (identity, Val{N}))
301
+
302
+ @inline reduced_indices {Ax<:Axis} (axs:: Tuple{Vararg{Axis}} , region:: Type{Ax} ) =
303
+ _reduced_indices (reduced_axis, (), region, axs... )
304
+ @inline reduced_indices (axs:: Tuple{Vararg{Axis}} , region:: Axis ) =
305
+ _reduced_indices (reduced_axis, (), region, axs... )
306
+ @inline reduced_indices0 {Ax<:Axis} (axs:: Tuple{Vararg{Axis}} , region:: Type{Ax} ) =
307
+ _reduced_indices (reduced_axis0, (), region, axs... )
308
+ @inline reduced_indices0 (axs:: Tuple{Vararg{Axis}} , region:: Axis ) =
309
+ _reduced_indices (reduced_axis0, (), region, axs... )
310
+
311
+ reduced_indices (axs:: Tuple{Vararg{Axis}} , region:: Tuple ) =
312
+ reduced_indices (reduced_indices (axs, region[1 ]), tail (region))
313
+ reduced_indices (axs:: Tuple{Vararg{Axis}} , region:: Tuple{Vararg{Axis}} ) =
314
+ reduced_indices (reduced_indices (axs, region[1 ]), tail (region))
315
+ reduced_indices0 (axs:: Tuple{Vararg{Axis}} , region:: Tuple ) =
316
+ reduced_indices0 (reduced_indices0 (axs, region[1 ]), tail (region))
317
+ reduced_indices0 (axs:: Tuple{Vararg{Axis}} , region:: Tuple{Vararg{Axis}} ) =
318
+ reduced_indices0 (reduced_indices0 (axs, region[1 ]), tail (region))
319
+
320
+ @inline _reduced_indices {name} (f, out, chosen:: Type{Axis{name}} , ax:: Axis{name} , axs... ) =
321
+ _reduced_indices (f, (out... , f (ax)), chosen, axs... )
322
+ @inline _reduced_indices {name} (f, out, chosen:: Axis{name} , ax:: Axis{name} , axs... ) =
323
+ _reduced_indices (f, (out... , f (ax)), chosen, axs... )
324
+ @inline _reduced_indices (f, out, chosen, ax:: Axis , axs... ) =
325
+ _reduced_indices (f, (out... , ax), chosen, axs... )
326
+ _reduced_indices (f, out, chosen) = out
327
+
328
+ reduced_axis (ax) = ax (oftype (ax. val, Base. OneTo (1 )))
329
+ reduced_axis0 (ax) = ax (oftype (ax. val, length (ax. val) == 0 ? Base. OneTo (0 ) : Base. OneTo (1 )))
330
+
331
+
283
332
function Base. permutedims (A:: AxisArray , perm)
284
333
p = permutation (perm, axisnames (A))
285
334
AxisArray (permutedims (A. data, p), axes (A)[[p... ]])
0 commit comments