NDArray Tutorial

来源:互联网 发布:查看linux磁盘读写速率 编辑:程序博客网 时间:2024/06/15 16:37

根据 mxnet documentation-NDArray
NDArray 是 mxnet 用于计算的数据结构. 可类比于 tensorflow 的 tensor,caffe 的 blob.
看到 mxnet 中的 NDArray 使用与 numpy 差别不大, 操作都很简明.
这个网页都是基础操作, 我记录了其中较关键的部分.

创建 NDArray

NDArray 既可直接创建, 也可以从 numpy 的 ndarray 转换得到.

a = mx.nd.array([1,2,3])c = np.arange(15).reshape(3,5)# create a 2-dimensional array from a numpy.ndarray objecta = mx.nd.array(c)

制定数据类型

默认是 float32, 如需改变可通过 dtype 设置.

# float32 is used in defaulta = mx.nd.array([1,2,3])# create an int32 arrayb = mx.nd.array([1,2,3], dtype=np.int32)# create a 16-bit float arrayc = mx.nd.array([1.2, 2.3], dtype=np.float16)

填充函数

# create a 2-dimensional array full of zeros with shape (2,3)a = mx.nd.zeros((2,3))# create a same shape array full of onesb = mx.nd.ones((2,3))# 全是7c = mx.nd.full((2,3), 7)# 随机值d = mx.nd.empty((2,3))

打印

使用asnumpy来打印 NDArray

b = mx.nd.arange(18).reshape((3,2,3))b.asnumpy()

基本操作

与 numpy 一样, * 代表矩阵对应元素相乘 (点乘),dot表示矩阵相乘.

a = mx.nd.arange(4).reshape((2,2))b = a * ac = mx.nd.dot(a,a)

切片

切片操作默认在 axis=0, 即上. 也可通过slice_axis来确定在哪个维度切片.

#按行切, 设置序号为1的行内数据为1a = mx.nd.array(np.arange(6).reshape(3,2))a[1:2] = 1a[:].asnumpy()#按列切, 取出序号为1的列(从0开始d = mx.nd.slice_axis(a, axis=1, begin=1, end=2)d.asnumpy()

形状

除了 axis=1 上可以不同, 被concat的矩阵其他维度都要相同.
如 a.shape:(1L,2L,3L,4L),b.shape:(1L,10L,3L,4L)
那么 c = mx.nd.concat(a,b)
c.shape:(1L, 12L, 3L, 4L)

降维

使用summean, 从特定的维度sum_axis

a = mx.nd.ones((2,3))b = mx.nd.sum(a)c = mx.nd.sum_axis(a, axis=1)

广播

使用broadcast_to方法.
在使用 + 或 *, 两个矩阵维度不同的时候, 会自动广播.

a = mx.nd.array(np.arange(6).reshape(6,1))b = a.broadcast_to((6,4))#多维度广播c = a.reshape((2,1,1,3))d = c.broadcast_to((2,2,2,3))#自动广播a = mx.nd.ones((3,2))b = mx.nd.ones((1,2))c = a + b

复制

a = mx.nd.ones((2,2))b = ab is a # will be Trueb = a.copy()b is a  # will be False

GPU 支持

NDArray 设备信息存放在 ndarray.context 中.

gpu_device=mx.gpu() # Change this to mx.cpu() in absence of GPUs.def f():    a = mx.nd.ones((100,100))    b = mx.nd.ones((100,100))    c = a + b    print(c)# in default mx.cpu() is usedf()# change the default context to the first GPUwith mx.Context(gpu_device):    f()

mxnet 计算的所需的数据结构需存在相同的设备中. 可使用copyto方法, 将 cpu 数据转存到 gpu 中.

文件读写

推荐使用saveload方法. 因为其支持多语言, 兼容分布式.

d = {'a':a, 'b':b}mx.nd.save("temp.ndarray", d)c = mx.nd.load("temp.ndarray")