MXNet数据操作基础学习(NDArray)

MXNet数据操作基础学习(NDArray)

NDArray 程序包 (mxnet.ndarray) 包含类似于 numpy.ndarray 的张量计算包。两者的语法很相近,但NDArray能够提供更多的功能,如CPU和GPU的异步计算和自动求导功能。(本文代码来自《动手学深度学习》(李沐))

一、创建


from mxnet import nd  #导入mxnet为nd

x = nd.arange(12);x # 利用arange函数创建一个0-11的行向量

OUT1:

[ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9. 10. 11.]

<NDArray 12 @cpu(0)>

print(x.shape) #查看x的形状 

print(x.size) #查看x中元素的总数

OUT1:

(12,)

OUT2:

12


X = x.reshape(3,4);X  #利用reshape函数将x向量转化成三行四列的矩阵(二维张量)X

x.reshape(-1,3)  #利用reshape的函数将x转化为三列,其中行数不确定的张量(元素总数已知,行数可以推断出,用-1表示即可)

OUT1:

[[ 0.  1.  2.  3.]

[ 4.  5.  6.  7.]

[ 8.  9. 10. 11.]]

<NDArray 3x4 @cpu(0)>

OUT2:

[[ 0.  1.  2.]

[ 3.  4.  5.]

[ 6.  7.  8.]

[ 9. 10. 11.]]

<NDArray 4x3 @cpu(0)>


nd.zeros((2,3,4)) #创建一个各元素都为零,形状为(2,3,4)的张量

nd.ones((3,4)) #创建一个各元素为1形状为(3,4)的张量

OUT1:

[[[0. 0. 0. 0.]

[0. 0. 0. 0.]

  [0. 0. 0. 0.]]

[[0. 0. 0. 0.]

  [0. 0. 0. 0.]

  [0. 0. 0. 0.]]]

<NDArray 2x3x4 @cpu(0)>

OUT2:

[[1. 1. 1. 1.]

[1. 1. 1. 1.]

[1. 1. 1. 1.]]

<NDArray 3x4 @cpu(0)>


Y = nd.array([[2,1,4,3,],[1,2,3,4],[4,3,2,1]]);Y #通过列表指定需要创建的NDArray中每个元素的值

OUT1:

[[2. 1. 4. 3.]

[1. 2. 3. 4.]

[4. 3. 2. 1.]]

<NDArray 3x4 @cpu(0)>


nd.random.normal(0,1,shape = (3,4)) #创建一个形状为(3,4)的NDArray,它的值服从均值为0,标准差为1的随机正态分布

OUT1:

[[ 1.1630785  0.4838046  0.29956347  0.15302546]

[-1.1688148  1.558071  -0.5459446  -2.3556297 ]

[ 0.54144025  2.6785064  1.2546344  -0.54877406]]

<NDArray 3x4 @cpu(0)>


二、运算

print(X) #X矩阵

print(Y) #Y矩阵

X+Y #NDArray支持大量的运算符, X+Y两个矩阵按照元素相加

OUT1:

[[ 0.  1.  2.  3.]

[ 4.  5.  6.  7.]

[ 8.  9. 10. 11.]]

<NDArray 3x4 @cpu(0)>


OUT2:

[[2. 1. 4. 3.]

[1. 2. 3. 4.]

[4. 3. 2. 1.]]

<NDArray 3x4 @cpu(0)>

OUT3:

[[ 2.  2.  6.  6.]

[ 5.  7.  9. 11.]

[12. 12. 12. 12.]]

<NDArray 3x4 @cpu(0)>


X/Y #按照元素位置做除法

OUT1:

[[ 0.    1.    0.5  1.  ]

[ 4.    2.5  2.    1.75]

[ 2.    3.    5.  11.  ]]

<NDArray 3x4 @cpu(0)>


Y.exp() #对Y矩阵按照元素做指数运算

OUT1:

[[ 7.389056  2.7182817 54.59815  20.085537 ]

[ 2.7182817  7.389056  20.085537  54.59815  ]

[54.59815  20.085537  7.389056  2.7182817]]

<NDArray 3x4 @cpu(0)>



print(nd.dot(X,Y.T)) #可以用dot做矩阵乘法运算,Y.T表示矩阵转置

OUT1:

[[ 18.  20.  10.]

[ 58.  60.  50.]

[ 98. 100.  90.]]

<NDArray 3x3 @cpu(0)>




nd.concat (X,Y,dim = 0) #矩阵按行连结

nd.concat (X,Y,dim = 1) #矩阵按列连结

OUT1:

[[ 0.  1.  2.  3.]

[ 4.  5.  6.  7.]

[ 8.  9. 10. 11.]

[ 2.  1.  4.  3.]

[ 1.  2.  3.  4.]

[ 4.  3.  2.  1.]]

<NDArray 6x4 @cpu(0)>

OUT2:

[[ 0.  1.  2.  3.  2.  1.  4.  3.]

[ 4.  5.  6.  7.  1.  2.  3.  4.]

[ 8.  9. 10. 11.  4.  3.  2.  1.]]

<NDArray 3x8 @cpu(0)>




X==Y #条件判别式,如果X,Y位置上的元素相同,那么新NDArray的相同位置则为1,否则为0

OUT1:

[[0. 1. 0. 1.]

[0. 0. 0. 0.]

[0. 0. 0. 0.]]

<NDArray 3x4 @cpu(0)>



X.sum() #元素求和

OUT1:

[66.]

<NDArray 1 @cpu(0)>




三、广播机制

当对两个形状不同的NDArray进行运算时,可能会触发广播机制:适当复制元素使得两个NDArray形状相同后再按照元素进行运算。

简单来说,广播机制可以这样理解:如果你有一个m*n的矩阵,让它加减乘除一个1*n 的矩阵,它会被复制m次,成为一个m*n的矩阵,然后再逐元素地进行加减乘除操作。同样地对m*1的矩阵成立.

A =nd.arange(3).reshape((3,1)) #构建一个3*1的矩阵,共3个元素

B =nd.arange(2).reshape((1,2))#构建一个1*2的矩阵,共2个元素

print(A)

print(B)

print(A+B)  #广播机制,将A中第一列的三个元素复制到第二列,B中第一行的2个元素被复制到第二行和第三行,从而形成两个三行两列的矩阵相加

OUT1:

[[0.]

[1.]

[2.]]

<NDArray 3x1 @cpu(0)>

OUT2:

[[0. 1.]]

<NDArray 1x2 @cpu(0)>

OUT3:

[[0. 1.]

[1. 2.]

[2. 3.]]

<NDArray 3x2 @cpu(0)>



print(X)

X[1:3]  #索引,遵循python索引的左闭右开和从0开始原则,索引第2到3行

OUT1:

[[ 0.  1.  2.  3.]

[ 4.  5.  6.  7.]

[ 8.  9. 10. 11.]]

<NDArray 3x4 @cpu(0)>

OUT2:

[[ 4.  5.  6.  7.]

[ 8.  9. 10. 11.]]

<NDArray 2x4 @cpu(0)>




X[1,2] = 9;X  #访问第一行第二列的元素,为其重新赋值为9

OUT1:

[[ 0.  1.  2.  3.]

[ 4.  5.  9.  7.]

[ 8.  9. 10. 11.]]

<NDArray 3x4 @cpu(0)>

X[1:2,:] = 12;X #索引第二行所有元素,将其赋值为12

OUT1:

[[ 0.  1.  2.  3.]

[12. 12. 12. 12.]

[ 8.  9. 10. 11.]]

<NDArray 3x4 @cpu(0)>



四、转换

import numpy as np#导入numpy P = np.ones((2,3));P#numpy构建

OUT1:

array([[1., 1., 1.],

[1., 1., 1.]])



D = nd.array(P);D#转换为NDArray

OUT1:

[[1. 1. 1.]

[1. 1. 1.]]

<NDArray 2x3 @cpu(0)>



D.asnumpy()#NDArray转化为numpy

OUT1:

array([[1., 1., 1.],

[1., 1., 1.]], dtype=float32)

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