《Gluon 动手学深度学习 二》NDArray和NumPy

  • Post author:
  • Post category:其他

“在深度学习中,通常会频繁地对数据进行操作。在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/


版权声明:本文为qq_42189368原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。