package org.nd4j.examples;
import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.api.ops.impl.indexaccum.IMin;
import org.nd4j.linalg.factory.Nd4j;
import java.util.Arrays;
/**
* --- Nd4j Example 5: Accumulation/Reduction Operations ---
*
* In this example, we'll see ways to reduce INDArrays - for example, perform sum and max operations
*
* @author Alex Black
*/
public class Nd4jEx5_Accumulations {
public static void main(String[] args){
/*
There are two types of accumulation/reduction operations:
- Whole array operations -> returns a scalar value
- Operations along one or more dimensions -> returns an array
Furthermore, there are two classes of accumulations:
- Standard accumulations: Accumulations that return a real-value - for example, min, max, sum, etc.
- Index accumulations: Accumulations that return an integer index - for example argmax
*/
INDArray originalArray = Nd4j.linspace(1,15,15).reshape('c',3,5); //As per example 3
System.out.println("Original array: \n" + originalArray);
//First, let's consider whole array reductions:
double minValue = originalArray.minNumber().doubleValue();
double maxValue = originalArray.maxNumber().doubleValue();
double sum = originalArray.sumNumber().doubleValue();
double avg = originalArray.meanNumber().doubleValue();
double stdev = originalArray.stdNumber().doubleValue();
System.out.println("minValue: " + minValue);
System.out.println("maxValue: " + maxValue);
System.out.println("sum: " + sum);
System.out.println("average: " + avg);
System.out.println("standard dev.: " + stdev);
//Second, let's perform the same along dimension 0.
//In this case, the output is a [1,5] array; each output value is the min/max/mean etc of the corresponding column:
INDArray minAlong0 = originalArray.min(0);
INDArray maxAlong0 = originalArray.max(0);
INDArray sumAlong0 = originalArray.sum(0);
INDArray avgAlong0 = originalArray.mean(0);
INDArray stdevAlong0 = originalArray.std(0);
System.out.println("\n\n\n");
System.out.println("min along dimension 0: " + minAlong0);
System.out.println("max along dimension 0: " + maxAlong0);
System.out.println("sum along dimension 0: " + sumAlong0);
System.out.println("avg along dimension 0: " + avgAlong0);
System.out.println("stdev along dimension 0: " + stdevAlong0);
//If we had instead performed these along dimension 1, we would instead get a [3,1] array out
//In this case, each output value would be the reduction of the values in each column
//Again, note that when this is printed it looks like a row vector, but is in facta column vector
INDArray avgAlong1 = originalArray.mean(1);
System.out.println("\n\navg along dimension 1: " + avgAlong1);
System.out.println("Shape of avg along d1: " + Arrays.toString(avgAlong1.shape()));
//Index accumulations return an integer value.
INDArray argMaxAlongDim0 = Nd4j.argMax(originalArray,0); //Index of the max value, along dimension 0
System.out.println("\n\nargmax along dimension 0: " + argMaxAlongDim0);
INDArray argMinAlongDim0 = Nd4j.getExecutioner().exec(new IMin(originalArray),0); //Index of the min value, along dimension 0
System.out.println("argmin along dimension 0: " + argMinAlongDim0);
}
}