/// <summary> /// Returns a view that is a view of a single element /// </summary> /// <param name="element">The element to view</param> /// <returns>The subview</returns> public NdArray <T> Subview(long element) { if (element < 0) { element = this.Shape.Dimensions[0].Length + element; } if (element < 0 || element > this.Shape.Dimensions[0].Length) { throw new ArgumentOutOfRangeException("element"); } //Special case if (this.Shape.Dimensions.LongLength == 1) { long pos = this.Shape[element]; return(Reshape(new Shape( new long[] { 1 }, //Single element pos, //Offset to position new long[] { this.Shape.Length - pos } //Skip the rest ))); } Shape.ShapeDimension[] dims = new Shape.ShapeDimension[this.Shape.Dimensions.Length - 1]; Array.Copy(this.Shape.Dimensions, 1, dims, 0, dims.Length); //We need to modify the top dimension to skip the elements we wish to hide long newoffset = this.Shape[element]; return(this.Reshape(new Shape(dims, newoffset))); }
/// <summary> /// Returns a view that is a view of a range of elements /// </summary> /// <param name="range">The range to view</param> /// <param name="dim">The dimension to apply the range to</param> /// <param name="removeIfSingleEl">True if the dimension is removed if it is a single element, false otherwise</param> /// <returns>The subview</returns> public NdArray <T> Subview(Range range, long dim, bool removeIfSingleEl = false) { long first = range.First < 0 ? (this.Shape.Dimensions[dim].Length) + range.First : range.First; long offset = dim == this.Shape.Dimensions.LongLength ? this.Shape.Length : this.Shape.Offset + first * this.Shape.Dimensions[dim].Stride; long last; long stride; if (range.Initialized) { if (range.NewDimension) { Shape.ShapeDimension[] n = new Shape.ShapeDimension[this.Shape.Dimensions.LongLength + 1]; Array.Copy(this.Shape.Dimensions, 0, n, 0, dim); Array.Copy(this.Shape.Dimensions, dim, n, dim + 1, n.LongLength - (dim + 1)); n[dim] = new NumCIL.Shape.ShapeDimension(1, 0); return(this.Reshape(new Shape(n, this.Shape.Offset))); } else if (range.SingleElement) { last = first; } else { last = range.Last <= 0 ? (this.Shape.Dimensions[dim].Length - 1) + range.Last : range.Last - 1; } stride = range.Stride; } else { last = this.Shape.Dimensions[dim].Length - 1; stride = 1; } long j = 0; Shape.ShapeDimension[] dimensions; if (range.SingleElement && removeIfSingleEl) { dimensions = this.Shape.Dimensions.Where(x => j++ != dim).ToArray(); } else { dimensions = this.Shape.Dimensions.Select(x => { if (j++ == dim) { if (last * stride > this.Shape.Dimensions[dim].Length - 1) { last = (this.Shape.Dimensions[dim].Length - 1) / stride; } return(new Shape.ShapeDimension((last - first) + 1, stride * x.Stride)); } else { return(x); } }).ToArray(); } return(this.Reshape(new Shape(dimensions, offset))); }