MXNET深度学习框架-01-ndarray最基本的使用(数据结构)

mxnet之ndarray最基本的使用

最近在学习mxnet这个深度学习框架,俗话说:“好记性不如烂笔头”,现将学习的过程及内容记录下来,以备自己可以随时查看回顾。

PS:在我的笔记本电脑上,我安装的是mxnet-gpu版,便于后面的深度神经网络搭建,语言为python 3.6.7,IDE为PyCharm。

首先需要导入ndarray的包(ndarray与numpy非常像):

from mxnet import ndarray as nd

1、创建矩阵

mat = nd.zeros(shape=(3, 4))  # 创建全0的矩阵(3行4列)
ones = nd.ones(shape=(5, 6))  # 创建全1的矩阵(5行6列)
array = nd.array([[1, 2], [3, 4]])
print(mat)
print("==========")
print(ones)
print("==========")
print(array)

运行结果:
MXNET深度学习框架-01-ndarray最基本的使用(数据结构)_第1张图片
2、创建随机数组

random_array = nd.random_normal(0, 1, shape=(3, 4))  # 服从均值0方差1的正太分布
print("随机数组:",random_array)
print("数组维度:",random_array.shape)  # 查看数组维度,与numpy一样
print("数组大小:",random_array.size)   # 查看数组元素个数,行列相乘

运行结果:
MXNET深度学习框架-01-ndarray最基本的使用(数据结构)_第2张图片
3、操作符
常规的加减乘除没必要使用MXNET中的ndarray,感觉有点大材小用,这里只记录指数运算和点乘。
(1)指数运算:
代码生成的随机数组:
MXNET深度学习框架-01-ndarray最基本的使用(数据结构)_第3张图片

ex_array=nd.exp(random_array)  # 对每个元素做指数运算
print("指数运算-数组:",ex_array)

运行结果:
MXNET深度学习框架-01-ndarray最基本的使用(数据结构)_第4张图片
(2)点乘

print("点乘运算:",nd.dot(random_array,random_array.T)) # (3,4)矩阵和(4,3)矩阵相乘-->(3,3)矩阵

运行结果:
MXNET深度学习框架-01-ndarray最基本的使用(数据结构)_第5张图片
4、广播
当二元操作符左右两边ndarray维度不一样时,系统会尝试将其复制到一个共同的形状。

a=nd.arange(3).reshape(shape=(3,1))
b=nd.arange(2).reshape(shape=(1,2))
print("a:",a)
print("b:",b)
print("a+b:",a+b)

运行结果:
MXNET深度学习框架-01-ndarray最基本的使用(数据结构)_第6张图片
它会将“a”和“b”扩展成一个3X2的矩阵,这样就可以进行相加了。

5、跟numpy的转换

import numpy as np
x=np.ones(shape=(1,2))
y=nd.array(x) # numpy-->ndarray(mxnet)
z=y.asnumpy() # ndarray(mxnet)-->numpy
print(type(y),type(z))

运行结果:
在这里插入图片描述
6、替换操作
使用python的操作如p=l+p,会把y从现在的实例指向新的实例,这样会开辟一个新的内存,浪费资源。

l=nd.ones(shape=(3,4))
p=nd.ones(shape=(3,4))
z=nd.elemwise_add(l,p) # 加法
print(z)

运行结果:
MXNET深度学习框架-01-ndarray最基本的使用(数据结构)_第7张图片
一句话:ndarray是mxnet中的一个处理数组(可多维)的一个方法包,与numpy非常相似。其它有关API可在官网处查询。
本节所有代码:

from mxnet import ndarray as nd
'''----创建矩阵---'''
mat = nd.zeros(shape=(3, 4))  # 创建全0的矩阵(3行4列)
ones = nd.ones(shape=(5, 6))  # 创建全1的矩阵(5行6列)
array = nd.array([[1, 2], [3, 4]])
print(mat)
print("==========")
print(ones)
print("==========")
print(array)
'''---创建随机数组-----'''
random_array = nd.random_normal(0, 1, shape=(3, 4))  # 服从均值0方差1的正太分布
print("随机数组:",random_array)
print("数组维度:",random_array.shape)  # 查看数组维度,与numpy一样
print("数组大小:",random_array.size)   # 查看数组元素个数,行列相乘

'''---操作符---'''
ex_array=nd.exp(random_array)  # 对每个元素做指数运算
print("指数运算-数组:",ex_array)
print("点乘运算:",nd.dot(random_array,random_array.T)) # (3,4)矩阵和(4,3)矩阵相乘-->(3,3)矩阵

'''---广播---'''
# 当二元操作符左右两边ndarray维度不一样时,系统会尝试将其复制到一个共同的形状。
a=nd.arange(3).reshape(shape=(3,1))
b=nd.arange(2).reshape(shape=(1,2))
print("a:",a)
print("b:",b)
print("a+b:",a+b)

'''---跟numpy的转换---'''
# mxnet中的ndarray可以与numpy进行转化
import numpy as np
x=np.ones(shape=(1,2))
y=nd.array(x) # numpy-->ndarray(mxnet)
z=y.asnumpy() # ndarray(mxnet)-->numpy
print(type(y),type(z))

'''---替换操作---(不开辟内存,节省内存)'''
# 使用python的操作如p=l+p,会把y从现在的实例指向新的实例,这样会开辟一个新的内存,浪费资源
l=nd.ones(shape=(3,4))
p=nd.ones(shape=(3,4))
z=nd.elemwise_add(l,p) # 加法,创建的是临时空间
print(z)

你可能感兴趣的