public void Case2_Axis4() { var shape = new Shape(1, 2, 1, 1, 3); var sh = new NDCoordinatesAxisIncrementor(ref shape, 4); var slices = sh.Slices; slices.Should().ContainInOrder(Slice.Index(0), Slice.Index(0), Slice.Index(0), Slice.Index(0), Slice.All); sh.Next().Should().ContainInOrder(Slice.Index(0), Slice.Index(1), Slice.Index(0), Slice.Index(0), Slice.All); sh.Next().Should().BeNull(); }
public override NDArray ReduceArgMax(NDArray arr, int? axis_) { //in order to iterate an axis: //consider arange shaped (1,2,3,4) when we want to summarize axis 1 (2nd dimension which its value is 2) //the size of the array is [1, 2, n, m] all shapes after 2nd multiplied gives size //the size of what we need to reduce is the size of the shape of the given axis (shape[axis]) var shape = arr.Shape; if (shape.IsEmpty) return arr; if (shape.IsScalar || (shape.size == 1 && shape.NDim == 1)) return NDArray.Scalar(0); if (axis_ == null) return NDArray.Scalar(argmax_elementwise(arr)); var axis = axis_.Value; while (axis < 0) axis = arr.ndim + axis; //handle negative axis if (axis >= arr.ndim) throw new ArgumentOutOfRangeException(nameof(axis)); if (shape[axis] == 1) { //if the given div axis is 1 and can be squeezed out. return np.squeeze_fast(arr, axis); } //handle keepdims Shape axisedShape = Shape.GetAxis(shape, axis); //prepare ret var ret = new NDArray(NPTypeCode.Int32, axisedShape, false); var iterAxis = new NDCoordinatesAxisIncrementor(ref shape, axis); var iterRet = new NDCoordinatesIncrementor(ref axisedShape); var iterIndex = iterRet.Index; var slices = iterAxis.Slices; #if _REGEN #region Compute switch (arr.GetTypeCode) { %foreach supported_numericals,supported_numericals_lowercase% case NPTypeCode.#1: { int at; do { var iter = arr[slices].AsIterator<#2>();
public void Case1_Axis1() { var shape = new Shape(2, 3, 3); var sh = new NDCoordinatesAxisIncrementor(ref shape, 1); var slices = sh.Slices; slices.Should().ContainInOrder(Slice.Index(0), Slice.All, Slice.Index(0)); sh.Next().Should().ContainInOrder(Slice.Index(0), Slice.All, Slice.Index(1)); sh.Next().Should().ContainInOrder(Slice.Index(0), Slice.All, Slice.Index(2)); sh.Next().Should().ContainInOrder(Slice.Index(1), Slice.All, Slice.Index(0)); sh.Next().Should().ContainInOrder(Slice.Index(1), Slice.All, Slice.Index(1)); sh.Next().Should().ContainInOrder(Slice.Index(1), Slice.All, Slice.Index(2)); sh.Next().Should().BeNull(); }
public override NDArray ReduceAMin(NDArray arr, int? axis_, bool keepdims = false, NPTypeCode? typeCode = null) { //in order to iterate an axis: //consider arange shaped (1,2,3,4) when we want to summarize axis 1 (2nd dimension which its value is 2) //the size of the array is [1, 2, n, m] all shapes after 2nd multiplied gives size //the size of what we need to reduce is the size of the shape of the given axis (shape[axis]) var shape = arr.Shape; if (shape.IsEmpty) return arr; if (shape.IsScalar || shape.size == 1 && shape.dimensions.Length == 1) { var r = typeCode.HasValue ? Cast(arr, typeCode.Value, true) : arr.Clone(); if (keepdims) r.Storage.ExpandDimension(0); else if (!r.Shape.IsScalar && r.Shape.size == 1 && r.ndim == 1) r.Storage.Reshape(Shape.Scalar); return r; } if (axis_ == null) { var r = NDArray.Scalar(amin_elementwise(arr, typeCode)); if (keepdims) r.Storage.ExpandDimension(0); else if (!r.Shape.IsScalar && r.Shape.size == 1 && r.ndim == 1) r.Storage.Reshape(Shape.Scalar); return r; } var axis = axis_.Value; while (axis < 0) axis = arr.ndim + axis; //handle negative axis if (axis >= arr.ndim) throw new ArgumentOutOfRangeException(nameof(axis)); if (shape[axis] == 1) { //if the given div axis is 1 and can be squeezed out. if (keepdims) return new NDArray(arr.Storage.Alias()); return np.squeeze_fast(arr, axis); } //handle keepdims Shape axisedShape = Shape.GetAxis(shape, axis); //prepare ret var ret = new NDArray(typeCode ?? arr.GetTypeCode, axisedShape, false); var iterAxis = new NDCoordinatesAxisIncrementor(ref shape, axis); var iterRet = new NDCoordinatesIncrementor(ref axisedShape); var iterIndex = iterRet.Index; var slices = iterAxis.Slices; #if _REGEN1 #region Compute switch (arr.GetTypeCode) { %foreach supported_numericals,supported_numericals_lowercase% case NPTypeCode.#1: { switch (ret.GetTypeCode) { %foreach supported_numericals,supported_numericals_lowercase,supported_numericals_defaultvals% case NPTypeCode.#101: { do { var iter = arr[slices].AsIterator<#2>();
public override NDArray ReduceProduct(NDArray arr, int? axis_, bool keepdims = false, NPTypeCode? typeCode = null) { //in order to iterate an axis: //consider arange shaped (1,2,3,4) when we want to summarize axis 1 (2nd dimension which its value is 2) //the size of the array is [1, 2, n, m] all shapes after 2nd multiplied gives size //the size of what we need to reduce is the size of the shape of the given axis (shape[axis]) var shape = arr.Shape; if (shape.IsEmpty || shape.size==0) return NDArray.Scalar(1, (typeCode ?? arr.typecode)); if (shape.IsScalar || (shape.size == 1 && shape.NDim == 1)) { var r = NDArray.Scalar(typeCode.HasValue ? Converts.ChangeType(arr.GetAtIndex(0), typeCode.Value) : arr.GetAtIndex(0)); if (keepdims) r.Storage.ExpandDimension(0); return r; } if (axis_ == null) { var r = NDArray.Scalar(product_elementwise(arr, typeCode)); if (keepdims) r.Storage.ExpandDimension(0); else if (!r.Shape.IsScalar && r.Shape.size == 1 && r.ndim == 1) r.Storage.Reshape(Shape.Scalar); return r; } var axis = axis_.Value; while (axis < 0) axis = arr.ndim + axis; //handle negative axis if (axis >= arr.ndim) throw new ArgumentOutOfRangeException(nameof(axis)); if (shape[axis] == 1) { //if the given div axis is 1 and can be squeezed out. if (keepdims) return new NDArray(arr.Storage.Alias()); return np.squeeze_fast(arr, axis); } //handle keepdims Shape axisedShape = Shape.GetAxis(shape, axis); var retType = typeCode ?? (arr.GetTypeCode.GetAccumulatingType()); //prepare ret var ret = new NDArray(retType, axisedShape, false); var iterAxis = new NDCoordinatesAxisIncrementor(ref shape, axis); var iterRet = new NDCoordinatesIncrementor(ref axisedShape); var iterIndex = iterRet.Index; var slices = iterAxis.Slices; //resolve the accumulator type #if _REGEN1 #region Compute switch (arr.GetTypeCode) { %foreach supported_numericals,supported_numericals_lowercase% case NPTypeCode.#1: { switch (retType) { %foreach supported_numericals,supported_numericals_lowercase,supported_numericals_onevales% case NPTypeCode.#101: { do { var slice = arr[slices]; var iter = slice.AsIterator<#2>(); var moveNext = iter.MoveNext; var hasNext = iter.HasNext; |#102 sum = #103; while (hasNext()) sum *= (#102) moveNext(); ret.Set#101(Converts.To#101(sum), iterIndex); } while (iterAxis.Next() != null && iterRet.Next() != null); break; }