from mxnet import nd
创建向量
#创建行向量 x=nd.arange(12) print(x) #输出x的size print(x.shape) #把向量x的形状改成(3,4) X = x.reshape(3,4) print(X) Y = x.reshape(3,-1) print(Y) #创建一个各元素为0,形状为(2,3,4)的张量 Z = nd.zeros((2,3,4)) print(Z) #通过list指定需要创建的NDArray中每个元素的值 X2 = nd.array([[2,1,4,3],[1,2,3,4],[4,3,2,1]]) print(X2) #随机生成NDArray中每个元素的值 X3 = nd.random.normal(0,1,shape=(3,4)) print(X3)
数据操作
print(X+Y) #按元素乘法 print(X*Y) #按元素除法 print(X/Y) #按元素做指数运算 print(Y.exp()) #dot矩阵乘法 print(nd.dot(X,Y.T)) #矩阵连接 #按行连接 print(nd.concat(X,Y,dim=0)) #按列连接 print(nd.concat(X,Y,dim=1)) #X == Y print(X == Y) #X.sum print(X.sum()) #我们可以通过asscalar函数将结果变换为Python中的标量。下⾯例⼦中X的L2范数结果同上例 #⼀样是单元素NDArray,但最后结果变换成了Python中的标量。 print(X.norm().asscalar())
广播机制
''' 当对两个形状不同的NDArray按 元素运算时,可能会触发⼴播(broadcasting)机制:先适当复制元素使这两个NDArray形状相 同后再按元素运算。 ''' A = nd.arange(3).reshape((3,1)) B = nd.arange(2).reshape((1,2)) print(A) print(B) ''' 由于A和B分别是3⾏1列和1⾏2列的矩阵,如果要计算A + B,那么A中第⼀列的3个元素被⼴播 (复制)到了第⼆列,而B中第⼀⾏的2个元素被⼴播(复制)到了第⼆⾏和第三⾏。如此,就可以 对2个3⾏2列的矩阵按元素相加。 ''' print(A+B) #索引 ''' 例如,⼀个3⾏2列的矩阵的⾏索引分别为0、 1和2,列索引分别为0和1。 ''' print(X) print(X[1:3]) ''' 指定NDArray中需要访问的单个元素的位置,如矩阵中⾏和列的索引,并为该元素重新赋值 ''' X[1,2] = 9 ''' 截取⼀部分元素,并为它们重新赋值。在下⾯的例⼦中,我们为⾏索引为1的每⼀列元素重新赋值 ''' X[1:2,:] = 12 print(X)
运算内存开销
''' 截取⼀部分元素,并为它们重新赋值。在下⾯的例⼦中,我们为⾏索引为1的每 ⼀列元素重新赋值 如果想指定结果到特定内存,我们可以使⽤前⾯介绍的索引来进⾏替换操作。在下⾯的例⼦中, 我们先通过zeros_like创建和Y形状相同且元素为0的NDArray,记为Z。 ''' Z = Y.zeros_like() before = id(Z) Z[:] = X+Y print(id(Z) == before) ''' 实际上,上例中我们还是为X + Y开了临时内存来存储计算结果,再复制到Z对应的内存。如果 想避免这个临时内存开销,我们可以使⽤运算符全名函数中的out参数。 ''' nd.elemwise_add(X,Y,out=Z) print(id(Z) == before) ''' 如果X的值在之后的程序中不会复⽤,我们也可以⽤ X[:] = X + Y 或者 X += Y 来减少运算的内存开销 ''' before = id(X) X += Y print(id(X) == before)
NDArray和Numpy相互变换
import numpy as np #将Numpy实例变换成NDArray实例 P = np.ones( (2,3) ) D = nd.array(P) print(P) print(D) #将NDArray实例变换成Numpy实例 D = D.asnumpy() print("==================") print( type(D) )
自动求梯度
from mxnet import autograd,nd # 对函数 y = 2x⊤x 求关于列向量 x 的梯度。我们先创建变量x,并赋初值。 x = nd.arange(4).reshape((4,1)) #为了求有关变量x的梯度,我们需要先调⽤attach_grad函数来申请存储梯度所需要的内存 x.attach_grad() #下⾯定义有关变量x的函数。为了减少计算和内存开销,默认条件下MXNet不会记录⽤于求梯度 # 的计算。我们需要调⽤record函数来要求MXNet记录与求梯度有关的计算。 with autograd.record(): y = 3*nd.dot(x.T,x) #通过调⽤backward函数⾃动求梯度。 print(y) y.backward() print(x.grad)