ND4J/加法与乘法

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容