package org.nd4j.examples;
import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.api.ops.impl.transforms.Sin;
import org.nd4j.linalg.factory.Nd4j;
import org.nd4j.linalg.ops.transforms.Transforms;
import java.util.Arrays;
/**
* --- Nd4j示例 4:使用INDArrays的附加操作---
*
* 在这个例子中,我们将看到处理INDArray的方法
*
* @author Alex Black
*/
public class Nd4jEx4_Ops {
public static void main(String[] args){
/*
ND4J定义了很多的操作,现在我们来看看如何使用它们中的一些:
- 元素级别操作: add, multiply, divide, subtract, 等 add, mul, div, sub,
INDArray.add(INDArray), INDArray.mul(INDArray), etc
- 矩阵操作:mmul
- 行/列向量操作:addRowVector, mulColumnVector, 等
- 元素级别转换, 如tanh, 标量max操作, 等等
*/
//首先让我们来看看就地操作与拷贝操作对比
//考虑一下调用: myArray.add(1.0)对比myArray.addi(1.0)
//例如, "add" 对比. "addi" -> "i" 表示应地操作
//在实践中:就地操作修改原始数组;其他操作(“拷贝操作”)进行拷贝
INDArray originalArray = Nd4j.linspace(1,15,15).reshape('c',3,5);
INDArray copyAdd = originalArray.add(1.0);
System.out.println("由add返回的对象: " + (originalArray == copyAdd));
System.out.println("在originalArray.add(1.0)执行之后的原始数组:\n" + originalArray);
System.out.println("拷贝添加的数组:\n" + copyAdd);
//让我们对就地添加操作执行相同的操作:
INDArray inPlaceAdd = originalArray.addi(1.0);
System.out.println();
//addi 返回同一个JABA对象
System.out.println("由addi返回的对象: " + (originalArray == inPlaceAdd));
System.out.println("originalArray.addi(1.0)操作后返回的原始数组:\n" + originalArray);
System.out.println("就地添加的数组:\n" + copyAdd);
//让我们为下一节重新创建原始数组,并创建另一个数组:
originalArray = Nd4j.linspace(1,15,15).reshape('c',3,5);
//参见示例2;我们有一个3x5,具有统一的随机(0到1)值
INDArray random = Nd4j.rand(3,5);
//我们可以执行元素操作。请注意,数组形状必须在此处匹配
//对于标量add与addi的工作方式与完全相同
INDArray added = originalArray.add(random);
System.out.println("\n\n\n 随机值:\n" + random);
System.out.println("原始加上随机值:\n" + added);
//矩阵操作很容易:
INDArray first = Nd4j.rand(3,4);
INDArray second = Nd4j.rand(4,5);
INDArray mmul = first.mmul(second);
//期望的3x5 输出
System.out.println("\n\n\n mmul数组的形状为: " + Arrays.toString(mmul.shape()));
//我们可以按行(“每行”)和按列(“每列”)操作
//同样,inplace与copy操作的工作方式相同(即addRowVector与addiRowVector)
INDArray row = Nd4j.linspace(0,4,5);
System.out.println("\n\n\n 行:\n" + row);
INDArray mulRowVector = originalArray.mulRowVector(row);
//对于“originalArray”中的每一行,使用行向量执行逐元素乘法
System.out.println("originalArray.mulRowVector(row)的结果");
System.out.println(mulRowVector);
//元素方向的转换类似于“tanh”和标量max值。这些可以通过几种方式应用:
System.out.println("\n\n\n");
//同样,请注意打印精度有限,如示例2所示。
System.out.println("随机数组:\n" + random);
System.out.println("元素在随机数组上的tanh转换:\n" + Transforms.tanh(random));
System.out.println("元素在随机数组上的乘方转换 (x^3.0) :\n" + Transforms.pow(random,3.0));
System.out.println("元素与标量max操作 (与标量0.5):\n" + Transforms.max(random,0.5));
//我们也可以更详细地执行此操作:
INDArray sinx = Nd4j.getExecutioner().execAndReturn(new Sin(random.dup()));
System.out.println("元素sin(x)操作:\n" + sinx);
}
}
运行结果
由add返回的对象: false
在originalArray.add(1.0)执行之后的原始数组:
[[ 1.0000, 2.0000, 3.0000, 4.0000, 5.0000],
[ 6.0000, 7.0000, 8.0000, 9.0000, 10.0000],
[ 11.0000, 12.0000, 13.0000, 14.0000, 15.0000]]
拷贝添加的数组:
[[ 2.0000, 3.0000, 4.0000, 5.0000, 6.0000],
[ 7.0000, 8.0000, 9.0000, 10.0000, 11.0000],
[ 12.0000, 13.0000, 14.0000, 15.0000, 16.0000]]
由addi返回的对象: true
originalArray.addi(1.0)操作后返回的原始数组:
[[ 2.0000, 3.0000, 4.0000, 5.0000, 6.0000],
[ 7.0000, 8.0000, 9.0000, 10.0000, 11.0000],
[ 12.0000, 13.0000, 14.0000, 15.0000, 16.0000]]
就地添加的数组:
[[ 2.0000, 3.0000, 4.0000, 5.0000, 6.0000],
[ 7.0000, 8.0000, 9.0000, 10.0000, 11.0000],
[ 12.0000, 13.0000, 14.0000, 15.0000, 16.0000]]
随机值:
[[ 0.0183, 0.7362, 0.4703, 0.9437, 0.5912],
[ 0.1248, 0.1432, 0.6722, 0.0705, 0.3339],
[ 0.1951, 0.8349, 0.8127, 0.2331, 0.3958]]
原始加上随机值:
[[ 1.0183, 2.7362, 3.4703, 4.9437, 5.5912],
[ 6.1248, 7.1432, 8.6722, 9.0705, 10.3339],
[ 11.1951, 12.8349, 13.8127, 14.2331, 15.3958]]
mmul数组的形状为: [3, 5]
行:
[[ 0, 1.0000, 2.0000, 3.0000, 4.0000]]
originalArray.mulRowVector(row)的结果
[[ 0, 2.0000, 6.0000, 12.0000, 20.0000],
[ 0, 7.0000, 16.0000, 27.0000, 40.0000],
[ 0, 12.0000, 26.0000, 42.0000, 60.0000]]
随机数组:
[[ 0.0183, 0.7362, 0.4703, 0.9437, 0.5912],
[ 0.1248, 0.1432, 0.6722, 0.0705, 0.3339],
[ 0.1951, 0.8349, 0.8127, 0.2331, 0.3958]]
元素在随机数组上的tanh转换:
[[ 0.0183, 0.6268, 0.4384, 0.7369, 0.5307],
[ 0.1241, 0.1423, 0.5864, 0.0704, 0.3220],
[ 0.1926, 0.6831, 0.6711, 0.2289, 0.3763]]
元素在随机数组上的乘方转换 (x^3.0) :
[[ 6.1052e-6, 0.3990, 0.1040, 0.8403, 0.2066],
[ 0.0019, 0.0029, 0.3038, 0.0004, 0.0372],
[ 0.0074, 0.5821, 0.5368, 0.0127, 0.0620]]
元素与标量max操作 (与标量0.5):
[[ 0.5000, 0.7362, 0.5000, 0.9437, 0.5912],
[ 0.5000, 0.5000, 0.6722, 0.5000, 0.5000],
[ 0.5000, 0.8349, 0.8127, 0.5000, 0.5000]]
元素sin(x)操作:
[[ 0.0183, 0.6715, 0.4531, 0.8097, 0.5573],
[ 0.1245, 0.1427, 0.6227, 0.0705, 0.3277],
[ 0.1938, 0.7413, 0.7262, 0.2309, 0.3855]]
翻译:风一样的男子
image
网友评论