package org.nd4j.examples;
import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;
import java.util.Arrays;
/**
* --- Nd4j Example 2: Creating INDArrays ---
*
* In this example, we'll see a number of different ways to create INDArrays
*
* @author Alex Black
*/
public class Nd4jEx2_CreatingINDArrays {
public static void main(String[] args){
//Here, we'll see how to create INDArrays with different scalar value initializations
int nRows = 3;
int nColumns = 5;
INDArray allZeros = Nd4j.zeros(nRows, nColumns);
System.out.println("Nd4j.zeros(nRows, nColumns)");
System.out.println(allZeros);
INDArray allOnes = Nd4j.ones(nRows, nColumns);
System.out.println("\nNd4j.ones(nRows, nColumns)");
System.out.println(allOnes);
INDArray allTens = Nd4j.valueArrayOf(nRows, nColumns, 10.0);
System.out.println("\nNd4j.valueArrayOf(nRows, nColumns, 10.0)");
System.out.println(allTens);
//We can also create INDArrays from double[] and double[][] (or, float/int etc Java arrays)
double[] vectorDouble = new double[]{1,2,3};
INDArray rowVector = Nd4j.create(vectorDouble);
System.out.println("rowVector: " + rowVector);
System.out.println("rowVector.shape(): " + Arrays.toString(rowVector.shape())); //1 row, 3 columns
INDArray columnVector = Nd4j.create(vectorDouble, new int[]{3,1}); //Manually specify: 3 rows, 1 column
System.out.println("columnVector: " + columnVector); //Note for printing: row/column vectors are printed as one line
System.out.println("columnVector.shape(): " + Arrays.toString(columnVector.shape())); //3 row, 1 columns
double[][] matrixDouble = new double[][]{
{1.0, 2.0, 3.0},
{4.0, 5.0, 6.0}};
INDArray matrix = Nd4j.create(matrixDouble);
System.out.println("\nINDArray defined from double[][]:");
System.out.println(matrix);
//It is also possible to create random INDArrays:
//Be aware however that by default, random values are printed with truncated precision using INDArray.toString()
int[] shape = new int[]{nRows, nColumns};
INDArray uniformRandom = Nd4j.rand(shape);
System.out.println("\n\n\nUniform random array:");
System.out.println(uniformRandom);
System.out.println("Full precision of random value at position (0,0): " + uniformRandom.getDouble(0,0));
INDArray gaussianMeanZeroUnitVariance = Nd4j.randn(shape);
System.out.println("\nN(0,1) random array:");
System.out.println(gaussianMeanZeroUnitVariance);
//We can make things repeatable using RNG seed:
long rngSeed = 12345;
INDArray uniformRandom2 = Nd4j.rand(shape, rngSeed);
INDArray uniformRandom3 = Nd4j.rand(shape, rngSeed);
System.out.println("\nUniform random arrays with same fixed seed:");
System.out.println(uniformRandom2);
System.out.println();
System.out.println(uniformRandom3);
//Of course, we aren't restricted to 2d. 3d or higher is easy:
INDArray threeDimArray = Nd4j.ones(3,4,5); //3x4x5 INDArray
INDArray fourDimArray = Nd4j.ones(3,4,5,6); //3x4x5x6 INDArray
INDArray fiveDimArray = Nd4j.ones(3,4,5,6,7); //3x4x5x6x7 INDArray
System.out.println("\n\n\nCreating INDArrays with more dimensions:");
System.out.println("3d array shape: " + Arrays.toString(threeDimArray.shape()));
System.out.println("4d array shape: " + Arrays.toString(fourDimArray.shape()));
System.out.println("5d array shape: " + Arrays.toString(fiveDimArray.shape()));
//We can create INDArrays by combining other INDArrays, too:
INDArray rowVector1 = Nd4j.create(new double[]{1,2,3});
INDArray rowVector2 = Nd4j.create(new double[]{4,5,6});
INDArray vStack = Nd4j.vstack(rowVector1, rowVector2); //Vertical stack: [1,3]+[1,3] to [2,3]
INDArray hStack = Nd4j.hstack(rowVector1, rowVector2); //Horizontal stack: [1,3]+[1,3] to [1,6]
System.out.println("\n\n\nCreating INDArrays from other INDArrays, using hstack and vstack:");
System.out.println("vStack:\n" + vStack);
System.out.println("hStack:\n" + hStack);
//There's some other miscellaneous methods, too:
INDArray identityMatrix = Nd4j.eye(3);
System.out.println("\n\n\nNd4j.eye(3):\n" + identityMatrix);
INDArray linspace = Nd4j.linspace(1,10,10); //Values 1 to 10, in 10 steps
System.out.println("Nd4j.linspace(1,10,10):\n" + linspace);
INDArray diagMatrix = Nd4j.diag(rowVector2); //Create square matrix, with rowVector2 along the diagonal
System.out.println("Nd4j.diag(rowVector2):\n" + diagMatrix);
}
}