示例#1
0
        /// <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)));
        }
示例#2
0
        /// <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)));
        }