 # Ndarrays of ndarrays

Suppose I have a 2d ndarray whose elements are 2d ndarrays themselves. Can the outer 2d array be considered as a 4d array? Conversely, can a 4d array be taken as 2d array of 2d arrays or a 3d array of 1d arrays? If not, can you give me an alternative which can?

Edit -
Besides the answer, here's something interesting.

Specifically, what do you mean by "Can it be considered"? Surely it can be considered one, but I don't think that's all you are interested in.

For example, if a function accepts a 4d ndarrray as an argument, can it take the above 2d ndarray as well?

If you mean the `ndarray` crate, then no, because `Array` is generic over the dimensionality, so `Array<T, Ix4>` and `Array<Array<T, Ix2>, Ix2>` are distinct types. You'll have to explicitly convert the contents of the arrays in this case, for example by concatenating the whole nested array-of-arrays into a single `Vec` and then using `from_shape_vec()` for creating the required 4D array.

1 Like

That was comprehensive. Is there an alternative which makes this possible? I don't really require things like matrix multiplications, but the following are very desired.

1. Fast iteration (parallel iteration if it exists)
2. 4d = 2d + 2d = 3d + 1d (unlike ndarrays)
3. MaybeUninit is needed.

You could make your own `Array4D` trait and implement it for each of the types you want. Then be generic whenever you wish to accept such an array. One problem is that each subarray in an `Array<Array<T, Ix2>, Ix2>` may not be of the same size.

1 Like