/// <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)]); }
/// <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); }
/// <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); }
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); }
/// <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)); }
/// <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)]); }
public T Data <T>(params int[] shape) => Storage.Data <T>()[Shape.GetIndexInShape(shape)];