深度学习 mxnet的基本操作

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) )

猜你喜欢

转载自www.cnblogs.com/xiaochi/p/12608205.html
今日推荐