文章目录
- 1. 创建NDArray
- 1.1 模块导入:
- 1.2 创建行向量:
- 1.3 获取NDArray实例的形状
- 1.4 获取NDArray实例中元素(element)的总数:
- 1.5 改变NDArray示例的形状:
- 1.6 创建张量:
- 1.6.1 创建各元素为0的张量
- 1.6.2创建各元素为1的张量
- 1.7 通过Python的列表(list)指定需要创建的NDArray中每个元素的值
- 1.8 随机生成NDArray中每个元素的值
- 2. 运算(NDArray)
- 2.1 按元素加法:
- 2.2 按元素乘法:
- 2.3 按元素除法:
- 2.4 按元素做指数运算:
- 2.5 做矩阵乘法
- 2.6 将多个NDArray连结(concatenate)
- 2.7 使用条件判断式得到元素为0或1的新的NDArray。
- 2.8 对NDArray中所有元素求和得到一个只有一个元素的NDArray。
- 2.9 将结果(NDArray)转化成标量
- 3. 广播机制
- 3.1 概念
- 3.2 示例
- ① 定义两个NDArray:
- ② 广播(broadcasting)
- 4. 索引
- 4.1 概念:
- 4.2 通过索引截取矩阵范围:
- 4.3 访问NDArray中单个元素
- 4.4 截取部分元素,并为其重新赋值
- 5. 运算的内存开销
- 5.1 id()函数
- 5.2 避免临时内存开销:
- 5.3 减少内存开销:
- 6. NDArray和NumPy相互变换
- 6.1 思路:
- 6.2 实例:将NumPy实例变换成NDArray。
1. 创建NDArray
1.1 模块导入:
from mxnet import nd
1.2 创建行向量:
x = nd.arange()
● 示例:
1.3 获取NDArray实例的形状
x.shape
● 示例:
1.4 获取NDArray实例中元素(element)的总数:
x.size
● 示例:
1.5 改变NDArray示例的形状:
X = x.reshape()
● 示例:
使⽤reshape函数把⾏向量x的形状改为(3, 4),也就是⼀个3⾏4列的矩阵,并记作X。除了形状改变之外,X中的元素保持不变。
1.6 创建张量:
1.6.1 创建各元素为0的张量
nd.zeros()
● 示例:
我们创建⼀个各元素为0,形状为(2, 3, 4)的张量。实际上,之前创建的向量和矩阵都是特殊的张量。
1.6.2创建各元素为1的张量
nd.ones()
● 示例:
1.7 通过Python的列表(list)指定需要创建的NDArray中每个元素的值
Y = nd.array()
● 示例:
1.8 随机生成NDArray中每个元素的值
nd.random.normal()
● 示例:
2. 运算(NDArray)
2.1 按元素加法:
● 示例:
2.2 按元素乘法:
● 示例:
2.3 按元素除法:
● 示例:
2.4 按元素做指数运算:
Y.exp()
● 示例:
2.5 做矩阵乘法
nd.dot()
● 示例:
下⾯将X与Y的转置做矩阵乘法。由于X是3⾏4列的矩阵,Y转置为4⾏3列的矩阵,因此两个矩阵相乘得到3⾏3列的矩阵。
2.6 将多个NDArray连结(concatenate)
nd.concat()
● 示例:
下⾯分别在⾏上(维度0,即形状中的最左边元32 2. 预备知识素)和列上(维度1,即形状中左起第⼆个元素)连结两个矩阵。可以看到,输出的第⼀个NDArray在维度0的⻓度(6)为两个输⼊矩阵在维度0的⻓度之和(3 + 3),而输出的第⼆个NDArray在维度1的⻓度(8)为两个输⼊矩阵在维度1的⻓度之和(4 + 4)。
2.7 使用条件判断式得到元素为0或1的新的NDArray。
● 示例:
以 X == Y 为例,如果X和Y在相同位置的条件判断为真(值相等),那么新的NDArray在相同位置的值为1;反之为0。
2.8 对NDArray中所有元素求和得到一个只有一个元素的NDArray。
X.sum()
● 示例:
2.9 将结果(NDArray)转化成标量
X.asscalar()
● 示例:
例⼦中X的L2范数结果同上例⼀样是单元素NDArray,但最后结果变换成了Python中的标量。
● 拓展:
我们也可以把Y.exp()、X.sum()、X.norm()等分别改写为nd.exp(Y)、nd.sum(X)、nd.norm(X)等。
3. 广播机制
3.1 概念
当对两个形状不同的NDArray按元素运算时,可能会触发⼴播(broadcasting)机制:先适当复制元素使这两个NDArray形状相同后再按元素运算。
3.2 示例
① 定义两个NDArray:
② 广播(broadcasting)
由于A和B分别是3⾏1列和1⾏2列的矩阵,如果要计算A + B,那么A中第⼀列的3个元素被⼴播(复制)到了第⼆列,而B中第⼀⾏的2个元素被⼴播(复制)到了第⼆⾏和第三⾏。如此,就可以对2个3⾏2列的矩阵按元素相加。
4. 索引
4.1 概念:
● 在NDArray中,索引(index)代表了元素的位置。NDArray的索引从0开始逐⼀递增。例如,⼀个3⾏2列的矩阵的⾏索引分别为0、1和2,列索引分别为0和1。
● 注意:左闭右开
4.2 通过索引截取矩阵范围:
● 示例:
我们指定了NDArray的⾏索引截取范围[1:3]。依据左闭右开指定范围的惯例,它截取了矩阵X中⾏索引为1和2的两⾏。
4.3 访问NDArray中单个元素
● 示例:
矩阵中⾏和列的索引,并为该元素重新赋值。
4.4 截取部分元素,并为其重新赋值
● 示例:
例⼦中,我们为⾏索引为1的每⼀列元素重新赋值。
5. 运算的内存开销
5.1 id()函数
如果两个实例的ID一致,那么它们所对应的内存地址相同,反之则不同。
● 示例:
5.2 避免临时内存开销:
● 示例:
5.3 减少内存开销:
如果X的值在之后的程序中不会复⽤,我们也可以⽤ X[:] = X + Y 或者 X += Y 来减少运算的内存开销。
● 示例:
6. NDArray和NumPy相互变换
6.1 思路:
我们可以通过array函数和asnumpy函数令数据在NDArray和NumPy格式之间相互变换。
6.2 实例:将NumPy实例变换成NDArray。