深度学习预热——Numpy库的简单使用

小鸡
阅读804 喜欢3 算法 更新2019-4-9

Python等动态类型语言一般比C和C等静态类型语言运算速度慢。实际上,如果是运算量大的处理对象,用C/C写程序更好。为此,当Python中追求性能时,人们会用C/C来实现处理的内容。Python则承担“中间人”的角色,负责调用那些用C/ C写的程序。NumPy中,主要的处理也都是通过C或C++实现的。 因此,我们可以在不损失性能的情况下,使用Python便利的语法

NumPy 的算术运算

下面是NumPy数组的算术运算的例子。

>>> x = np.array([1.0, 2.0, 3.0])
>>> y = np.array([2.0, 4.0, 6.0])
>>> x + y # 对应元素的加法
array([ 3., 6., 9.])
>>> x - y
array([ -1., -2., -3.])
>>> x * y # element-wise product
array([ 2., 8., 18.])
>>> x / y
array([ 0.5, 0.5, 0.5])

NumPy的N维数组

NumPy不仅可以生成一维数组(排成一列的数组),也可以生成多维数组。 比如,可以生成如下的二维数组(矩阵)。

>>> A = np.array([[1, 2], [3, 4]]) 
>>> print(A)
[[1 2] [3 4]]
>>> A.shape
(2, 2)
>>> A.dtype
dtype(&aposint64&apos)

这里生成了一个2×2的矩阵A。另外,矩阵A的形状可以通过shape查看, 矩阵元素的数据类型可以通过dtype查看。下面,我们来看一下矩阵的算术运算。

>>> B = np.array([[3, 0],[0, 6]]) 
>>> A + B
array([[ 4, 2],
[ 3, 10]])
>>> A * B
array([[ 3, 0],
[ 0, 24]])
```

NumPy数组(np.array)可以生成N维数组,即可以生成一维数组、 二维数组、三维数组等任意维数的数组。数学上将一维数组称为向量, 将二维数组称为矩阵。另外,可以将一般化之后的向量或矩阵等统 称为张量(tensor)。本书基本上将二维数组称为“矩阵”,将三维数 组及三维以上的数组称为“张量”或“多维数组”


### 广播

NumPy中,形状不同的数组之间也可以进行运算。之前的例子中,在 2×2的矩阵A和标量10之间进行了乘法运算。在这个过程中,如图1-1所示, 标量10被扩展成了2×2的形状,然后再与矩阵A进行乘法运算。这个巧妙 的功能称为广播(broadcast)。

![image](https://note.youdao.com/yws/public/resource/10e4aca0d4cfd4a641afb8cae71b9f22/xmlnote/OFFICE8FC134D336E347B8BD38AE99EDEBD202/28)

![image](https://note.youdao.com/yws/public/resource/10e4aca0d4cfd4a641afb8cae71b9f22/xmlnote/OFFICE495F0A5511BF49D0A070CC44014055EA/30)

![](https://note.youdao.com/yws/public/resource/10e4aca0d4cfd4a641afb8cae71b9f22/xmlnote/OFFICE8C0E9A58138448198976AF6FE0F2AB9D/31)

我们通过下面这个运算再来看一个广播的例子。

A = np.array([[1, 2], [3, 4]])
B = np.array([10, 20])
A * B
array([[ 10, 40],
[ 30, 80]])


在这个运算中,如图1-2所示,一维数组B被“巧妙地”变成了和二位数 组A相同的形状,然后再以对应元素的方式进行运算。 综上,因为NumPy有广播功能,所以不同形状的数组之间也可以顺利 地进行运算。

![image](https://note.youdao.com/yws/public/resource/10e4aca0d4cfd4a641afb8cae71b9f22/xmlnote/OFFICE66577B46D6E042E5A03DCF05A0C4CAAC/29)
 
运用这个标记法,可以获取满足一定条件的元素。例如,要从X中抽出 大于15的元素,可以写成如下形式。
 

对NumPy数组使用不等号运算符等(上例中是X > 15) ,结果会得到一个 布尔型的数组。上例中就是使用这个布尔型数组取出了数组的各个元素(取 出True对应的元素)。
 
 
### 多维数组的运算
 

A = np.array([[1,2], [3,4]])
A.shape
(2, 2)

B = np.array([[5,6], [7,8]])
B.shape
(2, 2)

np.dot(A, B)
array([[19, 22],
[43, 50]])

这里,A和B都是2×2的矩阵,它们的乘积可以通过NumPy的 np.dot()函数计算(乘积也称为点积)。np.dot()接收两个NumPy数组作为参 数,并返回数组的乘积。这里要注意的是,np.dot(A, B)和np.dot(B, A)的 值可能不一样。
 
2×3的矩阵和3×2 的矩阵的乘积 可按如下形式用Python来实现。

![](https://note.youdao.com/yws/public/resource/10e4aca0d4cfd4a641afb8cae71b9f22/xmlnote/OFFICEA29B6568F4D445C7B1042BCA3C5A4696/32)
 
### 神经网络的内积
 
使用NumPy矩阵来实现神经网络。以图3-14中的简 单神经网络为对象。这个神经网络省略了偏置和激活函数,只有权重
![](https://note.youdao.com/yws/public/resource/10e4aca0d4cfd4a641afb8cae71b9f22/xmlnote/OFFICE443FC9256943447986747741E153314E/33)
 
实现该神经网络时,要注意X、W、Y的形状,特别是X和W的对应 维度的元素个数是否一致,这一点很重要
 
![](https://note.youdao.com/yws/public/resource/10e4aca0d4cfd4a641afb8cae71b9f22/xmlnote/OFFICEB77E7C3ACEDC4574A231DFF21AA51463/34)

使用np.dot(多维数组的点积),可以一次性计算出Y 的结果。 这意味着,即便Y 的元素个数为100或1000,也可以通过一次运算就计算出 结果!如果不使用np.dot,就必须单独计算Y 的每一个元素(或者说必须使 用for语句),非常麻烦
 
 
---

 
**注**:本文为**斋藤康毅**的《**深度学习入门:基于Python的理论与实现**》片段摘抄与学习笔记