机器学习基础2--python科学计算之numpy

利用python进行科学计算,numpy和pandas这两个库是必不可少的。

  • 运算速度快:numpy 和 pandas 都是采用 C 语言编写, pandas 又是基于 numpy, 是 numpy 的升级版本。
  • 消耗资源少:采用的是矩阵运算,会比 python 自带的字典或者列表快好多

先简单总结下numpy。

numpy 导入

省略下载和安装,代码中导入numpy

1
import numpy as np

numpy array 创建

numpy最常见的数据结构式array,创建一个numpy array也很简单

1
2
3
4
5
6
7
8
array = np.array([[1, 2, 3], [2, 3, 4]])  # python matrix
a = np.array([1, 2, 3], dtype=np.int)
a = np.zeros((3, 4)) # 数据全为0,3行4列
a = np.ones((3, 4), dtype=np.int) # 数据为1,3行4列
a = np.empty((3, 4)) # 数创建全空数组, 其实每个值都是接近于零的数
a = np.arange(10, 20, 2) # 10-19 的数据,2步长
a = np.arange(12).reshape((3,4)) # 3行4列,0到11
a = np.linspace(1,10,20) # 开始端1,结束端10,且分割成20个数据,生成线段

numpy array的基本操作

numpy的array有很多灵活的运算方法,包括单个array的四则运算,条件运算,变形, 转置, 对array任意一行一列进行求和,求最大最小值,求各类统计值等等操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
a = np.array([10, 20, 30, 40])  # array([10, 20, 30, 40])
b = np.arange(4) # array([0, 1, 2, 3])
print(b ** 2) # 单个array每个元素乘方
print(10 * np.sin(a))
print(b < 3) # 条件运算 [ True True True False]

# 矩阵变形
a = a.reshape(2, 2)
b = b.reshape(2, 2, )

a = np.random.random((2, 4, 2)) #生成随机矩阵

print(np.sum(a))
print(np.min(a))
print(np.max(a))
print(np.sort(a))

print(np.transpose(a))
print(a.T) # 矩阵转置

a = np.array([[1, 2], [3, 4]]) # array([10, 20, 30, 40])
print("sum =", np.sum(a, axis=0)) # 以列为单位,求和
print("sum =", np.sum(a, axis=1)) # 以行为单位,求和

两个array的加减乘

当然也支持两个array相加,相减,相乘

1
2
3
4
5
6
7
a = np.array([4, 3, 2, 1])
b = np.array([1, 1, 1, 1])
print(a + b) # [5 4 3 2]
print(a - b) # [[3 2 1 0]
print(a * b) # 矩阵相乘[4 3 2 1]
print(np.dot(a, b)) # 矩阵相乘求和 10
print(np.multiply(a, b))# 矩阵相乘 [16 12 8 4]

也可以支持两个或者多个矩阵的合并和分割操作:

array的合并

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
a = np.array([4, 3, 2, 1])
b = np.array([1, 1, 1, 1])
# [[4 3 2 1]
# [1 1 1 1]]
print(np.vstack((A,B))) # 垂直合并
# [4 3 2 1 1 1 1 1]
print(np.hstack((a, b))) # 水平合并
# [4 3 2 1 1 1 1 1 4 3 2 1]
print(np.concatenate((a, b, a, axis=0)) # 多矩阵垂直合并

a = np.array([4, 3, 2, 1])[:, np.newaxis]
#[[4]
# [3]
# [2]
# [1]]
b = np.array([1, 1, 1, 1])[:, np.newaxis]
#[[1]
# [1]
# [1]
# [1]]
print(np.concatenate((a, b, b), axis=1)) # 多矩阵水平合并
#[[4 1 1]
# [3 1 1]
# [2 1 1]
# [1 1 1]]

array的分割

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
34
# 创建数据
A = np.arange(12).reshape((3, 4))
print(A)
"""
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
"""

# 纵向分割
print(np.split(A, 2, axis=1))
"""
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
"""

# 横向分割
print(np.split(A, 3, axis=0))
# [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]

# 不等量的分割
print(np.array_split(A, 3, axis=1))
"""
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2],
[ 6],
[10]]), array([[ 3],
[ 7],
[11]])]
"""

np.newaxis

这里,我们使用了np.newaxis,newaxis的功能是插入新维度,结合例子我们看一下用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
a = np.array([1, 2, 3, 4])
print(a) # [1 2 3 4]
print(a.shape) # (4,)

b = a[:, np.newaxis]
print(b)
# [[1]
# [2]
# [3]
# [4]]
print(b.shape) # (4, 1)

c = a[np.newaxis, :]
print(c) # [[1 2 3 4]]
print(c.shape) # (1, 4)

总之numpy的array的操作方法很多,是我们科学计算的得力工具。

numpy copy & deep copy

numpy有两种方式拷贝值,一种是=号,一种是copy()方法,前者可以理解为引用,后者可以理解为简单的复制值。几行代码就明白了

1
2
3
4
5
6
7
8
9
10
import numpy as np

a = np.arange(4)

b = a
c = a.copy()

a[0] = 5
print(b) # [5 1 2 3]
print(c) # [0 1 2 3]