I have a multi dimensional array and previously used minimum() and maximum() to scale the entries between 0 and 1 independently along one of the dimensions.
arr = randn(3,128,128,1000) mi = minimum(arr, (2,3,4)) ma = maximum(arr, (2,3,4)) @. arr = (arr - mi) / (ma - mi)
Obviously it would be faster to use extrema instead. The obvious solution unfortunately does not work:
arr = randn(3,128,128,1000) mi, ma = extrema(arr, (2,3,4)) @. arr = (arr - mi) / (ma - mi)
Because extrema does not return a tuple of arrays (as I would have expected) but an array of tuples. I could come up with the following solution, but it does not really seem like a sane thing to do just to get the extrema in a usable form.
arr = randn(3,128,128,1000) ex = extrema(arr, (2,3,4)) ex = hcat([collect(i) for i in ex[:,1,1,1]]...)' mi = reshape(ex[:,1],3,1,1,1) ma = reshape(ex[:,2],3,1,1,1) @. arr = (arr - mi) / (ma - mi)
So now to my question: Is there a version of extrema (or a way of calling it) that gives me a tuple of arrays? If this does not exist: What is the best/most readable/ideomatic way of converting the one into the other?