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 void Case1_Axis0() { var shape = new Shape(2, 3, 3); var sh = new NDCoordinatesAxisIncrementor(ref shape, 0); var slices = sh.Slices; slices.Should().ContainInOrder(Slice.All, Slice.Index(0), Slice.Index(0)); sh.Next().Should().ContainInOrder(Slice.All, Slice.Index(0), Slice.Index(1)); sh.Next().Should().ContainInOrder(Slice.All, Slice.Index(0), Slice.Index(2)); sh.Next().Should().ContainInOrder(Slice.All, Slice.Index(1), Slice.Index(0)); sh.Next().Should().ContainInOrder(Slice.All, Slice.Index(1), Slice.Index(1)); sh.Next().Should().ContainInOrder(Slice.All, Slice.Index(1), Slice.Index(2)); sh.Next().Should().ContainInOrder(Slice.All, Slice.Index(2), Slice.Index(0)); sh.Next().Should().ContainInOrder(Slice.All, Slice.Index(2), Slice.Index(1)); sh.Next().Should().ContainInOrder(Slice.All, Slice.Index(2), Slice.Index(2)); sh.Next().Should().BeNull(); }
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; }