Mir Slice.shape is not consistent with the actual array shape

Pavel Shkadzko p.shkadzko at gmail.com
Sun May 24 15:01:04 UTC 2020


On Sunday, 24 May 2020 at 14:35:33 UTC, jmh530 wrote:
> On Sunday, 24 May 2020 at 14:21:26 UTC, Pavel Shkadzko wrote:
>> [snip]
>>
>> Sorry for the typo. It should be "auto arrSlice = a.sliced;"
>
> Try using fuse
>
> /+dub.sdl:
> dependency "mir-algorithm" version="*"
> +/
> import std.stdio;
> import std.conv;
> import std.array: array;
> import std.range: chunks;
> import mir.ndslice;
>
> int[] getShape(T : int)(T obj, int[] dims = null)
> {
>     return dims;
> }
>
> // return arr shape
> int[] getShape(T)(T obj, int[] dims = null)
> {
>     dims ~= obj.length.to!int;
>     return getShape!(typeof(obj[0]))(obj[0], dims);
> }
>
> void main() {
>     int[] arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 
> 15, 16];
>     int[][][] a = arr.chunks(4).array.chunks(2).array;
>
>     int err;
>     writeln(arr);
>     writeln(a.shape(err));
>
>     auto aSlice = a.fuse;
>     writeln(aSlice);
>     writeln(aSlice.shape);
>
> }

Yes, this works. It doesn't explain why sliced behaves like this 
though. Also, isn't sliced the default way of converting D arrays 
to Mir arrays? Above all arr.fuse.field flattens the array. So, 
fuse works as D join if combined with field but as slice 
allocator is used on a D array...


More information about the Digitalmars-d-learn mailing list