Beispiel #1
0
        /// <summary>
        /// Get single value from internal storage as type T and cast dtype to T
        /// </summary>
        /// <param name="indexes">indexes</param>
        /// <typeparam name="T">new storage data type</typeparam>
        /// <returns>element from internal storage</returns>
        public T GetData <T>(params int[] indexes)
        {
            this.ChangeDataType(this.DType);
            T[] values = this.GetData() as T[];

            return(values[Shape.GetIndexInShape(indexes)]);
        }
Beispiel #2
0
        /// <summary>
        /// Get single value from internal storage and do not cast dtype
        /// </summary>
        /// <param name="indexes">indexes</param>
        /// <returns>element from internal storage</returns>
        public object GetData(params int[] indexes)
        {
            object element = null;

            if (indexes.Length == Shape.NDim)
            {
                element = _values.GetValue(Shape.GetIndexInShape(indexes));
            }
            else if (Shape.Dimensions.Last() == 1)
            {
                element = _values.GetValue(Shape.GetIndexInShape(indexes));
            }
            else if (indexes.Length == Shape.NDim - 1)
            {
                var offset = new int[Shape.NDim];
                for (int i = 0; i < Shape.NDim - 1; i++)
                {
                    offset[i] = indexes[i];
                }

                NDArray nd = new NDArray(DType, Shape.Dimensions[Shape.NDim - 1]);
                for (int i = 0; i < Shape.Dimensions[Shape.NDim - 1]; i++)
                {
                    offset[offset.Length - 1] = i;
                    nd[i] = _values.GetValue(Shape.GetIndexInShape(offset));
                }

                return(nd);
            }
            else
            {
                throw new Exception("indexes must be equal to number of dimension.");
            }
            return(element);
        }
Beispiel #3
0
        /// <summary>
        /// Get single value from internal storage and do not cast dtype
        /// </summary>
        /// <param name="indexes">indexes</param>
        /// <returns>element from internal storage</returns>
        public object GetData(params int[] indexes)
        {
            object element = null;

            if (indexes.Length == Shape.NDim)
            {
                element = _values.GetValue(Shape.GetIndexInShape(indexes));
            }
            else if (Shape.Dimensions.Last() == 1)
            {
                element = _values.GetValue(Shape.GetIndexInShape(indexes));
            }
            else
            {
                throw new Exception("indexes must be equal to number of dimension.");
            }
            return(element);
        }
Beispiel #4
0
        protected void _ChangeColumnToRowLayout()
        {
            if (_Shape.NDim == 1)
            {
            }
            else if (_Shape.NDim == 2)
            {
                var puffer = Array.CreateInstance(_values.GetType().GetElementType(), _values.Length);

                var pufferShape = new Shape(_Shape.Dimensions);
                pufferShape.ChangeTensorLayout(1);

                for (int idx = 0; idx < _values.Length; idx++)
                {
                    puffer.SetValue(_values.GetValue(idx), pufferShape.GetIndexInShape(Shape.GetDimIndexOutShape(idx)));
                }

                _values = puffer;
            }
            else
            {
                var puffer = Array.CreateInstance(_values.GetType().GetElementType(), _values.Length);

                var pufferShape = new Shape(_Shape.Dimensions);
                pufferShape.ChangeTensorLayout(1);

                for (int idx = 0; idx < _values.Length; idx++)
                {
                    puffer.SetValue(_values.GetValue(idx), pufferShape.GetIndexInShape(Shape.GetDimIndexOutShape(idx)));
                }

                _values = puffer;
            }
            _TensorLayout = 1;
            Shape.ChangeTensorLayout(1);
        }
Beispiel #5
0
 /// <summary>
 /// Set 1 single value to internal storage and keep dtype
 /// </summary>
 /// <param name="value"></param>
 /// <param name="indexes"></param>
 public void SetData(object value, params int[] indexes)
 {
     _values.SetValue(value, _Shape.GetIndexInShape(indexes));
 }
Beispiel #6
0
        /// <summary>
        /// Retrieve element
        /// low performance, use generic Data<T> method for performance sensitive invoke
        /// </summary>
        /// <param name="select"></param>
        /// <returns></returns>
        public object this[params int[] select]
        {
            get
            {
                if (select.Length == Shape.NDim)
                {
                    switch (values)
                    {
                    case double[] values:
                        return(values[Shape.GetIndexInShape(select)]);

                    case int[] values:
                        return(values[Shape.GetIndexInShape(select)]);
                    }

                    return(null);
                }
                else
                {
                    int start  = Shape.GetIndexInShape(select);
                    int length = Shape.DimOffset[select.Length - 1];

                    var nd = new NDArray(dtype);

                    switch (values)
                    {
                    case double[]     values:
                        Span <double> double8 = GetData <double>();
                        nd.Storage.Set(double8.Slice(start, length).ToArray());
                        break;

                    case int[]     values:
                        Span <int> int32 = GetData <int>();
                        nd.Storage.Set(int32.Slice(start, length).ToArray());
                        break;
                    }

                    int[] shape = new int[Shape.NDim - select.Length];
                    for (int i = select.Length; i < Shape.NDim; i++)
                    {
                        shape[i - select.Length] = Shape[i];
                    }
                    nd.Storage.Shape = new Shape(shape);

                    return(nd);
                }
            }

            set
            {
                if (select.Length == Shape.NDim)
                {
                    switch (values)
                    {
                    case double[] values:
                        values[Shape.GetIndexInShape(select)] = (double)value;
                        break;

                    case int[] values:
                        values[Shape.GetIndexInShape(select)] = (int)value;
                        break;
                    }
                }
                else
                {
                    int start  = Shape.GetIndexInShape(select);
                    int length = Shape.DimOffset[Shape.NDim - 1];

                    switch (value)
                    {
                    case double v:
                        Span <double> data1     = GetData <double>();
                        var           elements1 = data1.Slice(start, length);

                        for (int i = 0; i < elements1.Length; i++)
                        {
                            elements1[i] = v;
                        }

                        break;

                    case int v:
                        Span <int> data2     = GetData <int>();
                        var        elements2 = data2.Slice(start, length);

                        for (int i = 0; i < elements2.Length; i++)
                        {
                            elements2[i] = v;
                        }

                        break;
                    }
                }
            }
        }
        /// <summary>
        /// Get single value from internal storage as type T and cast dtype to T
        /// </summary>
        /// <param name="indexes">indexes</param>
        /// <typeparam name="T">new storage data type</typeparam>
        /// <returns>element from internal storage</returns>
        public T GetData <T>(params int[] indexes)
        {
            T[] values = this.GetData() as T[];

            return(values[Shape.GetIndexInShape(indexes)]);
        }
Beispiel #8
0
 public T Data <T>(params int[] shape) => Storage.Data <T>()[Shape.GetIndexInShape(shape)];