# 深度学习之《深度学习入门》学习笔记（一）Python入门

> 作者：zning（https://ning.ae） · 发布：2019/08/12 21:41 下午 (UTC+8) · 原文：https://zning.me/15656172902685.html

最近学习吴恩达《Machine Learning》课程以及《深度学习入门：基于Python的理论与实现》书，一些东西总结了下。现就后者学习进行笔记总结。本文是本书的学习笔记（一）Python入门。

* [深度学习之《深度学习入门》学习笔记（一）Python入门](./15656172902685.html)

* [深度学习之《深度学习入门》学习笔记（二）感知机](./15656174993229.html)

* [深度学习之《深度学习入门》学习笔记（三）神经网络](./15656175642754.html)

* [深度学习之《深度学习入门》学习笔记（四）神经网络的学习](./15691207315042.html)

## NumPy

```python
import sys, os
sys.path.append('../input/deeplearningfromscratch/deeplearningfromscratch')  # 为了导入父目录中的文件而进行的设定

import numpy as np
x= np.array([1.0, 2.0, 3.0])
print(x)
```

>    [1. 2. 3.]

```python
type(x)
```

>    numpy.ndarray

```python
# 下面是NumPy数组的算术运算例子
x = np.array([1.0, 2.0, 3.0])
y = np.array([2.0, 3.0, 4.0])
print(x + y)
print(x - y)
print(x * y) # element-wise porduct
print(x / y)
```

> [3. 5. 7.]
> [-1. -1. -1.]
> [ 2.  6. 12.]
> [0.5        0.66666667 0.75      ]

当x和y的元素个数相同时，可以对各个元素进行算术运算。如果元素个数不同，程序就会报错。所以**元素个数保持一致非常重要**。

另外，对应元素的英文是element-wise，比如“对应元素的乘法”就是element-wisse product

NumPy数组也可以和单一的数值（标量）组合起来进行运算。此时，需要在NumPy数组的各个元素和标量之间进行运算。这个功能**也被称为广播**。

```python
x = np.array([1.0, 2.0, 3.0])
print(x / 2.0)
```

> [0.5 1.  1.5]

```python
# NumPy的多维数组
A = np.array([[1, 2],[3, 4]])
print(A)
```

> [[1 2]
>  [3 4]]

矩阵的形状可以通过`shape`查看，矩阵元素的数据类型可以通过`dtype`查看

```python
A.shape
```

>  (2, 2)

```python
A.dtype
```

> dtype('int64')

```python
# 矩阵的算术运算
B = np.array([[3, 0],[0,6]])
A+B
```

> array([[ 4,  2],
>        [ 3, 10]])

```python
A*B
```

> array([[ 3,  0],
>        [ 0, 24]])

同样，矩阵也可以通过标量（单一数值）对矩阵进行算术运算，**这也是基于广播的功能**

```python
print(A)
A*10
```

> [[1 2]
>  [3 4]]

<!-- -->

> array([[10, 20],
>        [30, 40]])

在上面这个例子中，标量10被扩展成了2x2的形状，然后再与矩阵A进行乘法运算。这个巧妙的功能称为**广播**。

```python
# 一个广播的例子
A = np.array([[1, 2], [3, 4]])
B = np.array([10, 20])
A * B
```

> array([[10, 40],
>        [30, 80]])

上面这个运算中，一维数组B被巧妙地变成了和二维数组A相同的形状，然后再以对应元素的方式进行计算。

综上，因为NumPy有广播功能，所以不同形状的数组之间也可以顺利地进行运算。

```python
# 访问元素
X = np.array([[51, 55],[14,19],[0,4]])
print(X)
```

> [[51 55]
>  [14 19]
>  [ 0  4]]

```python
for row in X:
    print(row)
```

> [51 55]
> [14 19]
> [0 4]

```python
# 使用数组访问各个元素
X = X.flatten() # 将X转换为一维数组
print(X)
```

> [51 55 14 19  0  4]

```python
X[np.array([0,2,4])] #获取索引为0、2、4的元素
```

> array([51, 14,  0])

```python
# 从X中抽取大于15的元素
X > 15
```

> array([ True,  True, False,  True, False, False])

```python
X[X>15]
```

> array([51, 55, 19])

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

## Matplotlib

```python
import numpy as np
import matplotlib.pyplot as plt
```

```python
#生成数据
x = np.arange(0, 6, 0.1) #生成0-6的数据，步长为0.1
y = np.sin(x)
#绘制图像
plt.plot(x,y)
plt.show()
```

> ![output_28_0](media/15656172902685/output_28_0.png)

```python
# 尝试追加cos函数的图形，并尝试使用pyplot的添加标题和x轴标签名等其他功能
y2 = np.cos(x)

plt.plot(x, y, label="sin")
plt.plot(x, y2, linestyle = "--", label="cos")#用虚线绘制
plt.xlabel("x")
plt.ylabel("Y")
plt.title('sin & cos')
plt.legend()
plt.show()
```

> ![output_29_0](media/15656172902685/output_29_0.png)

`pyplot`中还提供了用于显示图像的方法`imshow()`。另外，可以使用`matplotlib.image`模块的`imread()`方法读入图像。

```python
from matplotlib.image import imread
img = imread('../input/lixiangzhilu/1.jpg')
plt.imshow(img)
```

>
> \<matplotlib.image.AxesImage at 0x7f08bf324cf8>
> ![output_33_1](media/15656172902685/output_33_1.png)
