Mir Slice.shape is not consistent with the actual array shape
9il
ilyayaroshenko at gmail.com
Sun May 24 15:24:14 UTC 2020
On Sunday, 24 May 2020 at 14:17:33 UTC, Pavel Shkadzko wrote:
> I am confused by the return value of Mir shape.
> Consider the following example.
>
> ///////////////////////////////////////////////////////////////////////////
> 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;
>
> writeln(arr);
> writeln(arr.shape);
>
> auto arrSlice = arr.sliced;
> writeln(arrSlice);
> writeln(arrSlice.shape);
>
> }
> ///////////////////////////////////////////////////////////////////////////
>
> [[[1, 2, 3, 4], [5, 6, 7, 8]], [[9, 10, 11, 12], [13, 14, 15,
> 16]]]
> [2, 2, 4] <-- correct shape
> [[[1, 2, 3, 4], [5, 6, 7, 8]], [[9, 10, 11, 12], [13, 14, 15,
> 16]]]
> [2] <-- which shape is that?
>
> I would expect sliced to create a Slice with the same dims.
> Well, sliced returns a shell over the array, but why does it
> return its own shape instead of the shape of the array it
> provides view into? This makes it even more confusing once you
> print both representations.
> What's the rationale here?
BTW, the code example above doesn't compiles.
OT:
Instead of
> 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;
you can generate the same common D array using Mir:
auto a = [2, 2, 4].iota!int(1).ndarray;
More information about the Digitalmars-d-learn
mailing list