【深度学习】MXNet基本数据结构NDArray常用操作

文章目录

概述

在MXNet深度学习框架中,NDArray是存储和变换数据的主要工具,和NumPy中的ndarray有异曲同工之妙。

在下面的示例中,主要展示了:

  1. NDarray的创建;
  2. NDArray之间的基本运算;
  3. NDArray广播机制;
  4. NDArray索引;
  5. NDArray内存开销;
  6. NDArray和NumPy多维数组之间的转换。

示例

# coding=utf-8
# author: BebDong
# 2018.12.10
# MXNet数据操作:NDArray是MXNet中主要的数据存储和变换工具


from mxnet import nd
import numpy as np

print('------- Create NDArray -------')
# 使用arange函数创建行向量
x = nd.arange(12)
print(x)
# 使用shape函数获取形状
print(x.shape)
# 使用size函数获取元素个数
print(x.size)
# 使用reshape函数更改形状,已知元素个数情况下三种等价形式。
# X = x.reshape((3, 4))
# X = x.reshape((3, -1))
X = x.reshape((-1, 4))
print(X)
# 通过list对象创建NDArray
lst = [[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]
Y = nd.array(lst)
print(Y)
# 随机生成值,下列从均值为0标准差为1的正态分布随机采样
print(nd.random.normal(0, 1, shape=(3, 4)))

# 创建一个元素均为0,形状为(2,3,4)的张量。向量和矩阵都是特殊的张量
print(nd.zeros((2, 3, 4)))
# 创建一个元素均为1,形状为(2,3,4)的张量
print(nd.ones((2, 3, 4)))


print('\n------- Operations on NDArrays -------')
# 按元素做四则运算
print(X + Y)
print(X * Y)
print(X - Y)
print(X / Y)
# 按元素做指数运算:两种形式
# print(nd.exp(Y))
print(Y.exp())
# 使用dot函数做点乘
print(nd.dot(X, Y.T))
# 使用concat函数连接多个NDArray:维度0表示在行上连接,维度1表示在列上连接
print(nd.concat(X, Y, dim=0))
print(nd.concat(X, Y, dim=1))
# 使用条件运算符可以得到元素为0或1的新NDArray
print(X == Y)
print(X < Y)
print(X > Y)
# 对所有元素求和,得到单元素NDArray:两种形式
# print(nd.sum(X))
print(X.sum())
# 求范数(L2),得到单元素NDArray:两种形式
# print(X.norm())
print(nd.norm(X))
# 使用asscalar函数将结果转换为标量
print(X.norm().asscalar())


print('\n------- Broadcast Mechanism -------')
# 当两个形状不同的NDArray按元素操作时,将触发广播机制(broadcasting):适当复制元素使得形状相同再操作
A = nd.arange(3).reshape((3, 1))
B = nd.arange(2).reshape((1, 2))
print(A + B)


print('\n------- Index of NDArray -------')
# 重新为单个元素赋值
X[1, 2] = 9
print(X)
# 索引从0开始,截取的时候遵从“左闭右开”的原则
print(X[1:3])
# 截取一部分元素同时赋值
X[1:2, :] = 12
print(X)


print('\n------- Memory Cost -------')
# 前面的例子中对每个操作都新开内存来存储运算结果。即使X = X + Y,也是新开内存然后X再指向新内存。下例进行了验证
before = id(X)
X = X + Y
after = id(X)
print(before == after)
# 指定内存存储(也创建了临时内存)。下例中zeros_like函数创建形状相同且元素为0的NDArray
Z = X.zeros_like()
before = id(Z)
# Z[:] = Z + Y
Z += Y
after = id(Z)
print(before == after)
# 避免内存开销,包括临时内存:运算符全名函数的out参数指定
nd.elemwise_add(X, Y, out=Z)
print(id(Z) == before)


print('\n------- NDArray && NumPy -------')
# 使用nd.array函数从NumPy格式创建NDArray。
P = np.ones((2, 3))
D = nd.array(P)
print(D)
# 将NDArray变换为NumPy格式
print(D.asnumpy(), '\n', type(D.asnumpy()))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值