Numpy简介

NumPy是一个功能强大的Python库, 主要用于对多维数组执行计算. NumPy这个词来源于两个单词– Numerical和Python. NumPy提供了大量的库函数和操作, 可以帮助程序员轻松地进行数值计算.
这类数值计算广泛用于以下任务:

  • 机器学习模型: 在编写机器学习算法时, 需要对矩阵进行各种数值计算. 例如矩阵乘法, 换位, 加法等. NumPy提供了一个非常好的库, 用于简单(在编写代码方面)和快速(在速度方面)计算. NumPy数组用于存储训练数据和机器学习模型的参数.
  • 图像处理和计算机图形学: 计算机中的图像表示为多维数字数组. NumPy成为同样情况下最自然的选择. 实际上, NumPy提供了一些优秀的库函数来快速处理图像. 例如: 镜像图像, 按特定角度旋转图像等.
  • 数学任务: NumPy对于执行各种数学任务非常有用, 如数值积分, 微分, 内插, 外推等. 因此, 当涉及到数学任务时, 它形成了一种基于Python的MATLAB的快速替代.

NumPy库的安装

安装NumPy库的最快也是最简单的方法是在shell上使用以下命令:
pip install numpy
一般使用时直接import即可
import numpy as np

NumPy中的数组创建

tips: numpy中的数组叫做ndarry
可以使用np.array(n)直接定义数组

函数 说明
np.array(n) 返回和数组n相同的ndarry
ndarry.shape 返回或修改ndarry的形状
ndarry.size 返回ndarry的size
ndarry.type 返回ndarry的type

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>>>import numpy as np
>>>myArray = np.array([[0, 1, 2, 3, 4, 5], [5, 4, 3, 2, 1, 0]])
>>>myArray
[[0 1 2 3 4 5]
[5 4 3 2 1 0]]
>>>myArray.shape
(2, 6)
>>>myArray.size
12
>>>myArray.dtype
int32
>>>myArray.shape = (3, 4)
>>>myArray
[[0 1 2 3]
[4 5 5 4]
[3 2 1 0]]
>>>myArray.shape
(3, 4)

同时也可以使用以下方法创建数组:

函数 说明
np.arange(n) 创建值为0-n的一维数组
np.zeros(shape) 创建形状为shape且值全为0的数组
np.zeros_like(a) 创建形状和ndarry数组a相同且值全为0的数组
np.ones(shape) 创建形状为shape且值全为1的数组
np.ones_like(a) 创建形状和ndarry数组a相同且值全为0的数组
np.full(shape, val) 创建形状为shape且值为val的数组
np.full_like(a, val) 创建形状和ndarry数组a相同且值全为0的数组
np.eye(n) 创建形状为n * n且对角线值为1其它位置值均为0的数组

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
>>>import numpy as np
>>>myArray0 = np.arange(3)
>>>myArray0
array([0, 1, 2])
>>>myArray1 = np.zeros((3, 6))
>>>myArray1
array([[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.]])
>>>myArray1_like = np.zeros_like(myArray1)
>>>myArray1_like
array([[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.]])
>>>myArray2 = np.ones((2, 4))
>>>myArray2
array([[1., 1., 1., 1.],
[1., 1., 1., 1.]])
>>>myArray2_like = np.ones_like(myArray2)
>>>myArray2_like
array([[1., 1., 1., 1.],
[1., 1., 1., 1.]])
>>>myArray3 = np.full((1, 2), 2)
>>>myArray3
array([[2, 2]])
>>>myArray3_like = np.full_like(myArray3, 2)
>>>myArray3_like
array([[2, 2]])
>>>myArray4 = np.eye(3)
>>>myArray4
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])

除此之外,还有一些方法也能生成新的ndarry:

函数 说明
np.linspace(start, stop, num=50, endpoint=True)) 返回从start到stop之间num个数形成的ndarry, endpoint 决定是否包含stop
np.contatenate((a1, a2…)) 合并ndarry

例如:

1
2
3
4
5
6
7
8
9
10
>>>import numpy as np
>>>a = np.linspace(1, 10, 4)
>>>a
array([ 1., 4., 7., 10.])
>>>b = np.linspace(1, 10, 4, endpoint=False)
>>>b
array([1. , 3.25, 5.5 , 7.75])
>>>c = np.concatenate((a, b))
>>>c
array([ 1. , 4. , 7. , 10. , 1. , 3.25, 5.5 , 7.75])

NumPy中数组的简单操作

可以使用基本的加减乘除对ndarry进行运算
例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> a = np.array([[1, 0], [0, 1]])
>>> b = np.array([[0, 1], [1, 0]])
>>> a + b
array([[1, 1],
[1, 1]])
>>> a - b
array([[ 1, -1],
[-1, 1]])
>>> a * b
array([[0, 0],
[0, 0]])
>>> a / b
Warning (from warnings module):
File "__main__", line 1
RuntimeWarning: divide by zero encountered in true_divide
array([[inf, 0.],
[ 0., inf]])

其中需要注意的是, 乘法运算符执行的是对位相乘而不是矩阵乘法.
要执行矩阵乘法, 可以使用a.dot(b)

1
2
3
>>> a.dot(b)
array([[0, 1],
[1, 0]])

ndarry数据规范化操作

获取数据类型:
ndarry.dtype

更改数据类型:
ndarry.astype(dtype)

保留有效数字:
numpy.around(a, decimals=0)

  • decimals: 保留decimals位小数, 可以为负数.

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> import numpy as np
>>> a = np.random.rand(4) * 10
>>> a
array([6.25245559, 3.6656897 , 7.70917278, 7.13953182])
>>> a.dtype
dtype('float64')
>>> b = a.astype(np.int32)
>>> b
array([6, 3, 7, 7])
>>> b.dtype
dtype('int32')
>>> c = np.around(a, decimals=2)
>>> c
array([6.25, 3.67, 7.71, 7.14])

ndarry中的矩阵操作

  • 求矩阵的逆矩阵: np.linalg.inv(ndarry)
  • 求矩阵的转置: ndarry.transpose() 或者 ndarry.T
  • 求矩阵的行列式: np.linalg.det(ndarry)
  • 求矩阵的特征向量和特征值: np.linalg.eig(ndarry)
  • 求取线性方程组的解:
    首先写出方程组的右边的y值向量: y=np.array([[y1],[y2],[y3]…])
    函数值的集合等于 x=solve(ndarry, y)
  • 矩阵的乘法: np.dot(ndarry1,ndarry2)