public override NDArray Cast(NDArray nd, NPTypeCode dtype, bool copy) { if (dtype == NPTypeCode.Empty) { throw new ArgumentNullException(nameof(dtype)); } NDArray clone() => new NDArray(nd.Storage.Clone()); if (nd.Shape.IsEmpty) { if (copy) { return(new NDArray(dtype)); } nd.Storage = new UnmanagedStorage(dtype); return(nd); } if (nd.Shape.IsScalar || (nd.Shape.size == 1 && nd.Shape.NDim == 1)) { var ret = NDArray.Scalar(nd.GetAtIndex(0), dtype); if (copy) { return(ret); } nd.Storage = ret.Storage; return(nd); } if (nd.GetTypeCode == dtype) { //casting not needed return(copy ? clone() : nd); } else { //casting needed if (copy) { if (nd.Shape.IsSliced) { nd = clone(); } return(new NDArray(new UnmanagedStorage(ArraySlice.FromMemoryBlock(nd.Array.CastTo(dtype), false), nd.Shape))); } else { var storage = nd.Shape.IsSliced ? nd.Storage.Clone() : nd.Storage; nd.Storage = new UnmanagedStorage(ArraySlice.FromMemoryBlock(storage.InternalArray.CastTo(dtype), false), storage.Shape); return(nd); } } }