《Gluon 动手学深度学习 二》NDArray和NumPy
"在深度学习中,通常会频繁地对数据进行操作。在MXNet中,NDArray是存储和变换数据的主要工具。NDArray和NumPy的多维数组非常类似。然而,NDArray提供更多的功能,例如CPU和GPU的异步计算,以及自动求导。这些都使得NDArray更加适合深度学习。"
1.创建NDArray
from mxnet import nd
x = nd.arange(12)
x结果:
x = x.reshape((4,3))
x结果:
x.reshape((3, 4))也可写成x.reshape((-1, 4))或x.reshape((3, -1))。由于x的元素个数是已知的,这里的-1是能够通过元素个数和其他维的大小推断出来的。
2.创建张量:
创建一个各元素为0,形状为(2, 3, 4)的张量。实际上,之前创建的向量和矩阵都是特殊的张量。
x=nd.zeros((2,3,4))
x结果:
3.通过列表(list)制定需要创建的NDArray中的元素
y = nd.array([[1,3,5],[2,6,7],[4,5,9]])
y结果:
4.随机生成NDArray元素
nd.random.normal(0,1,shape(3,4))
每个元素都随机采样于均值为0标准差为1的正态分布。
5.NDArray属性
#形状
y.shape
#元素总数
y.size
6.运算
创建的两个形状为(3, 4)的NDArray x , y
加减乘除法 结果形状不变。
连接两个矩阵
按照元素进行运算
以x == y为例,如果x和y在相同位置的条件判断为真(值相等),那么新NDArray在相同位置的值为1;反之为0。
转置
======注意======
①NDArray中元素求和后 是个标量,但是保留了NDArray格式
②可以通过asscalar函数转换为python中的数
7.广播机制broadcasting
由于a和b分别是3行1列和1行2列的矩阵,为了使它们可以按元素相加,计算时a中第一列的三个元素被广播(复制)到了第二列,而b中第一行的两个元素被广播(复制)到了第二行和第三行。如此,我们就可以对两个3行2列的矩阵按元素相加,得到上面的结果。
=====注意=====
运行内存开销
假设x和y都是NDArray,在执行y = x + y操作后, y所对应的内存地址将变成为存储x + y计算结果而新开内存的地址。
可以使用Python自带的id函数:如果两个实例的ID一致,它们所对应的内存地址相同;反之则不同。
8.索引
索引(index)代表了元素的位置。NDArray的索引从0开始逐一递增。例如一个3行2列的矩阵的行索引分别为0、1和2,列索引分别为0和1。
NDArray的行索引截取范围[1:3]。依据左闭右开指定范围的惯例,它截取了矩阵x中行索引为1和2的两行。
可以指定NDArray中需要访问的单个元素的位置,例如矩阵中行和列的索引,并重设该元素的值。
======================
NDArray和NumPy相互变换
import numpy as np
x = np.ones((2, 3))
y = nd.array(x) # NumPy 变换成 NDArray。
z = y.asnumpy() # NDArray 变换成 NumPy。
z, y
备注:
NumPy想要了解更多的知识,墙裂推荐学习参考3.中的内容!
参考:
1.NDArray API:https://mxnet.incubator.apache.org/api/python/ndarray/ndarray.html
2.NumPy:https://docs.scipy.org/doc/numpy/user/quickstart.html
3.Numpy教程:https://morvanzhou.github.io/tutorials/data-manipulation/np-pd/