Numpy基本用法

一、Numpy基本用法

NumPy是Python语言的一个扩充程序库。支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。Numpy内部解除了Python的PIL(全局解释器锁),运算效率极好,是大量机器学习框架的基础库!

1
2
3
4
5
#导入numpy库,并查看numpy库版本
In [1]: import numpy as np

In [2]: np.__version__
Out[2]: '1.14.3'
1
2
3
4
5
6
7
8
9
#利用numpy+matplotlib处理图片
In [7]: import matplotlib.pyplot as plt

In [8]: cat = plt.imread('D:\myProject\Python\Jupyter\image\cat.jpg')

In [9]: type(cat)
Out[9]: numpy.ndarray

In [10]: cat1 = cat -50
1
2
3
#图片是一个三维数组,长、宽、颜色
In [11]: cat.shape
Out[11]: (333, 500, 3)
1
2
3
In [12]: plt.imshow(cat1)
Out[12]: <matplotlib.image.AxesImage at 0x222924b0320>
In [13]: plt.show()

二、Numpy创建数组

1.使用np.array()由python list创建

1
2
3
4
5
6
7
8
In [14]: import numpy as np
#创建列表
In [15]: a = [1,2,3,4,5]
#将列表转换为数组
In [16]: b = np.array(a)

In [17]: b
Out[17]: array([1, 2, 3, 4, 5])

2.使用np的routines函数创建

2.1 np.ones()

1
2
3
4
5
6
7
8
9
10
11
12
13
# 1、np.ones(shape, dtype=None, order='C')
In [18]: np.ones(shape = (10,8),dtype= int)
Out[18]:
array([[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1]])
1
2
3
4
In [19]: ones = np.ones(shape=(100,90,4),dtype=int)

In [20]: plt.imshow(ones)
...: plt.show()

2.2 zeros()

1
2
3
4
5
6
7
# 2、zeros(shape, dtype=float, order='C')
In [21]: np.zeros((4,4))
Out[21]:
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])

2.3 np.full()

1
2
3
4
5
6
7
8
9
10
11
12
13
# 3、 np.full(shape, fill_value, dtype=None, order='C')
In [22]: np.full((10,10),fill_value=20)
Out[22]:
array([[20, 20, 20, 20, 20, 20, 20, 20, 20, 20],
[20, 20, 20, 20, 20, 20, 20, 20, 20, 20],
[20, 20, 20, 20, 20, 20, 20, 20, 20, 20],
[20, 20, 20, 20, 20, 20, 20, 20, 20, 20],
[20, 20, 20, 20, 20, 20, 20, 20, 20, 20],
[20, 20, 20, 20, 20, 20, 20, 20, 20, 20],
[20, 20, 20, 20, 20, 20, 20, 20, 20, 20],
[20, 20, 20, 20, 20, 20, 20, 20, 20, 20],
[20, 20, 20, 20, 20, 20, 20, 20, 20, 20],
[20, 20, 20, 20, 20, 20, 20, 20, 20, 20]])

2.4 np.eye()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 4、np.eye(N, M=None, k=0, dtype=<class 'float'>, order='C')
#对角线位1,其他位置位0
In [23]: np.eye(10)
Out[23]:
array([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]])

2.5 np.linspace()

1
2
3
4
5
6
7
8
9
# 5、np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
#lin = linear 线性
In [24]: np.linspace(1,100,20)
Out[24]:
array([ 1. , 6.21052632, 11.42105263, 16.63157895,
21.84210526, 27.05263158, 32.26315789, 37.47368421,
42.68421053, 47.89473684, 53.10526316, 58.31578947,
63.52631579, 68.73684211, 73.94736842, 79.15789474,
84.36842105, 89.57894737, 94.78947368, 100. ])

2.6 arange()

1
2
3
# 6、arange([start,] stop[, step,], dtype=None)
In [25]: np.arange(0,10,2)
Out[25]: array([0, 2, 4, 6, 8])

2.7 randint()

1
2
3
# 7、randint(low, high=None, size=None, dtype='l')
In [26]: np.random.randint(0,10,size = 10)
Out[26]: array([0, 9, 8, 9, 5, 5, 2, 6, 8, 7])

2.8 randn() 正太分布

1
2
3
4
5
6
7
# 8、randn(d0, d1, ..., dn)  正太分布
In [27]: np.random.randn(4,5)
Out[27]:
array([[ 1.05035386, 0.77231903, -0.33446991, -0.54562315, -0.84341866],
[ 0.6616944 , 0.89325969, -0.89042489, 1.61227272, -0.05136764],
[-0.5346068 , -2.39236557, -0.54563468, -1.07850467, 0.56603284],
[-0.33361988, 1.11445864, -0.11636709, 0.57361067, 0.80099792]])

2.9 normal() 正太分布

1
2
3
4
5
6
7
8
# 9、normal(loc=0.0, scale=1.0, size=None) 正太分布
In [28]: np.random.normal(loc=170,scale=1,size=20)
Out[28]:
array([168.56872023, 168.30641964, 169.98891802, 168.6781631 ,
169.63611345, 167.81502056, 169.69833366, 169.05166886,
170.96688262, 168.30677654, 170.15970816, 169.59783795,
170.77979873, 170.20138558, 169.75464312, 172.16309013,
169.37900208, 171.23951841, 169.7903996 , 168.62081606])

2.10 random_sample() 生成0到1的随机数

1
2
3
4
5
6
7
8
# 10、random_sample(size=None) 生成0到1的随机数
#np.random.random(size=20)
In [29]: r = np.random.random(size=(200,100,4)) #生成一张图片

In [30]: plt.imshow(r)
Out[30]: <matplotlib.image.AxesImage at 0x22293b60dd8>

In [31]: plt.show()

三、Numpy查看数组属性

1.数组元素个数

1
2
3
4
5
In [33]: b
Out[33]: array([1, 2, 3, 4, 5])

In [34]: b.size
Out[34]: 5

2.数组形状

1
2
In [35]: b.shape
Out[35]: (5,)

3.数组维度

1
2
In [36]: b.ndim
Out[36]: 1

4.数组元素类型

1
2
In [37]: b.dtype
Out[37]: dtype('int32')

四、数组的基本操作

1.索引

1
2
3
4
5
6
7
8
9
10
11
In [39]: array1 = np.random.randint(0,100,(4,4))

In [40]: array1
Out[40]:
array([[85, 18, 96, 92],
[42, 49, 76, 85],
[42, 1, 80, 99],
[33, 91, 74, 95]])

In [41]: array1[0,1]
Out[41]: 18

2.切片

1
2
3
4
5
6
7
8
9
10
#切片时,左闭右开
In [42]: array1[1:3,2:4]
Out[42]:
array([[76, 85],
[80, 99]])

In [43]: array2 = np.arange(0,10)

In [44]: array2
Out[44]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
1
2
3
#将数组反转
In [45]: array2[::-1]
Out[45]: array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
1
2
3
4
5
6
#通过两个::进行切片
In [46]: print(array2[::2])
[0 2 4 6 8]

In [47]: print(array2[::-2])
[9 7 5 3 1]

3.变形

  • 使用reshape函数,注意参数用tuple
1
2
3
4
5
6
7
8
9
In [48]: import numpy as np

In [49]: n = np.arange(0,10)

In [50]: n
Out[50]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [51]: n.shape
Out[51]: (10,)
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
35
36
37
#使用reshape函数进行变形
In [52]: n.reshape((5,2))
Out[52]:
array([[0, 1],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])

In [53]: n1 = np.random.randint(0,100,(3,4,5))

In [54]: n1
Out[54]:
array([[[48, 8, 2, 35, 65],
[81, 56, 20, 85, 76],
[94, 65, 62, 59, 78],
[48, 57, 7, 3, 63]],

[[56, 27, 4, 21, 28],
[92, 10, 73, 63, 82],
[88, 28, 10, 76, 99],
[49, 6, 39, 21, 50]],

[[84, 87, 65, 15, 52],
[94, 44, 40, 2, 94],
[ 7, 90, 78, 18, 94],
[94, 64, 83, 54, 6]]])

In [55]: n1.shape
Out[55]: (3, 4, 5)

In [56]: n1.reshape(3*4*5)
Out[56]:
array([48, 8, 2, 35, 65, 81, 56, 20, 85, 76, 94, 65, 62, 59, 78, 48, 57,
7, 3, 63, 56, 27, 4, 21, 28, 92, 10, 73, 63, 82, 88, 28, 10, 76,
99, 49, 6, 39, 21, 50, 84, 87, 65, 15, 52, 94, 44, 40, 2, 94, 7,
90, 78, 18, 94, 94, 64, 83, 54, 6])
1
2
3
4
5
6
7
#使用负数直接转换成一维数组
In [57]: n1.reshape(-1)
Out[57]:
array([48, 8, 2, 35, 65, 81, 56, 20, 85, 76, 94, 65, 62, 59, 78, 48, 57,
7, 3, 63, 56, 27, 4, 21, 28, 92, 10, 73, 63, 82, 88, 28, 10, 76,
99, 49, 6, 39, 21, 50, 84, 87, 65, 15, 52, 94, 44, 40, 2, 94, 7,
90, 78, 18, 94, 94, 64, 83, 54, 6])

4.级联

  • np.concatenate()级联需要注意的点:
    • 1.级联的参数是列表:一定要加中括号或小括号
    • 2.维度必须相同
    • 3.形状相符
    • 4.【重点】级联的方向默认是shape这个tuple的第一个值所代表的维度方向
    • 5.可通过axis参数改变级联的方向
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
In [58]: import numpy as np

In [59]: n1 = np.random.randint(0,10,(5,5))

In [60]: n1
Out[60]:
array([[1, 0, 1, 3, 2],
[0, 1, 9, 2, 9],
[2, 4, 1, 1, 1],
[5, 2, 2, 6, 2],
[8, 8, 8, 7, 2]])
#列级联
In [61]: np.concatenate((n1,n1),axis = 0)
Out[61]:
array([[1, 0, 1, 3, 2],
[0, 1, 9, 2, 9],
[2, 4, 1, 1, 1],
[5, 2, 2, 6, 2],
[8, 8, 8, 7, 2],
[1, 0, 1, 3, 2],
[0, 1, 9, 2, 9],
[2, 4, 1, 1, 1],
[5, 2, 2, 6, 2],
[8, 8, 8, 7, 2]])
#行级联
In [62]: np.concatenate((n1,n1),axis = 1)
Out[62]:
array([[1, 0, 1, 3, 2, 1, 0, 1, 3, 2],
[0, 1, 9, 2, 9, 0, 1, 9, 2, 9],
[2, 4, 1, 1, 1, 2, 4, 1, 1, 1],
[5, 2, 2, 6, 2, 5, 2, 2, 6, 2],
[8, 8, 8, 7, 2, 8, 8, 8, 7, 2]])

np.hstack与np.vstack

  • 水平级联与垂直级联,处理自己。进行维度的变更
1
2
3
4
In [63]: n2 = np.random.randint(0,100,size=10)

In [64]: n2
Out[64]: array([73, 65, 92, 23, 32, 47, 78, 83, 97, 37])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#vertical 垂直
In [65]: n3 = np.vstack(n2)

In [66]: print(n3.shape)
(10, 1)

In [67]: n3
Out[67]:
array([[73],
[65],
[92],
[23],
[32],
[47],
[78],
[83],
[97],
[37]])
1
2
3
4
5
6
7
8
# 水平
In [68]: n4 = np.array([[1,2,3,4,5],[6,7,8,9]])

In [69]: n4
Out[69]: array([list([1, 2, 3, 4, 5]), list([6, 7, 8, 9])], dtype=object)

In [70]: np.hstack(n4)
Out[70]: array([1, 2, 3, 4, 5, 6, 7, 8, 9])
1
2
In [71]: np.hstack(n3)
Out[71]: array([73, 65, 92, 23, 32, 47, 78, 83, 97, 37])

5.切分

  • 与级联类似,常用函数:
    • np.split
    • np.vsplit
    • np.hsplit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
In [72]: n5 = np.random.randint(0,150,size=(5,7))

In [73]: n5
Out[73]:
array([[122, 102, 37, 69, 28, 102, 131],
[ 48, 84, 27, 119, 7, 65, 61],
[ 17, 125, 142, 145, 132, 21, 57],
[ 96, 23, 72, 45, 77, 54, 65],
[120, 31, 104, 132, 64, 72, 145]])

In [74]: np.split(n5,(1,3))
Out[74]:
[array([[122, 102, 37, 69, 28, 102, 131]]),
array([[ 48, 84, 27, 119, 7, 65, 61],
[ 17, 125, 142, 145, 132, 21, 57]]),
array([[ 96, 23, 72, 45, 77, 54, 65],
[120, 31, 104, 132, 64, 72, 145]])]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#水平切分,即按行进行切分
In [75]: np.split(n5,(1,3),axis=1)
Out[75]:
[array([[122],
[ 48],
[ 17],
[ 96],
[120]]), array([[102, 37],
[ 84, 27],
[125, 142],
[ 23, 72],
[ 31, 104]]), array([[ 69, 28, 102, 131],
[119, 7, 65, 61],
[145, 132, 21, 57],
[ 45, 77, 54, 65],
[132, 64, 72, 145]])]
1
2
3
4
In [76]: np.split(n5,(1,3))[1]
Out[76]:
array([[ 48, 84, 27, 119, 7, 65, 61],
[ 17, 125, 142, 145, 132, 21, 57]])
1
2
3
4
5
6
7
8
9
10
11
In [81]: cat.shape
Out[81]: (333, 500, 3)

In [77]: import matplotlib.pyplot as plt

In [78]: cat1 = np.split(cat,(100,200))[1]

In [79]: plt.imshow(cat1)
Out[79]: <matplotlib.image.AxesImage at 0x22293e9b978>

In [80]: plt.show()

1
2
3
4
5
6
7
8
#垂直切分
In [82]: np.vsplit(n5,(1,3))
Out[82]:
[array([[122, 102, 37, 69, 28, 102, 131]]),
array([[ 48, 84, 27, 119, 7, 65, 61],
[ 17, 125, 142, 145, 132, 21, 57]]),
array([[ 96, 23, 72, 45, 77, 54, 65],
[120, 31, 104, 132, 64, 72, 145]])]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#水平切分
In [83]: np.hsplit(n5,(1,3))
Out[83]:
[array([[122],
[ 48],
[ 17],
[ 96],
[120]]), array([[102, 37],
[ 84, 27],
[125, 142],
[ 23, 72],
[ 31, 104]]), array([[ 69, 28, 102, 131],
[119, 7, 65, 61],
[145, 132, 21, 57],
[ 45, 77, 54, 65],
[132, 64, 72, 145]])]

6.副本

  • 所有赋值运算不会为ndarray的任何元素创建副本,对赋值后的对象的操作也对原来的对象生效。
1
2
3
4
5
6
7
8
9
10
11
In [84]: a = [x for x in range(5)]

In [85]: n = np.array(a)

In [86]: n
Out[86]: array([0, 1, 2, 3, 4])

In [87]: n[2] = 512

In [88]: n
Out[88]: array([ 0, 1, 512, 3, 4])
1
2
3
4
5
6
7
8
#当数据是ndarray,用=赋值,内存没有改变
In [89]: n2 = n

In [90]: n2[2] = 1024

In [91]: display(n,n2)
array([ 0, 1, 1024, 3, 4])
array([ 0, 1, 1024, 3, 4])
  • 使用copy()函数创建副本
1
2
3
4
5
6
7
8
9
10
In [92]: n3 = n.copy()

In [93]: n3
Out[93]: array([ 0, 1, 1024, 3, 4])

In [94]: n3[2] = 0

In [95]: display(n,n3)
array([ 0, 1, 1024, 3, 4])
array([0, 1, 0, 3, 4])

五、Numpy计算

条件运算

1
2
3
4
5
6
7
8
9
10
# 条件判断
In [97]: stus_score = np.array([[80,88],[82,81],[84,75],[86,83],[75,81]])

In [98]: stus_score > 80
Out[98]:
array([[False, True],
[ True, True],
[ True, False],
[ True, True],
[False, True]])
1
2
3
4
5
6
7
8
9
10
# 三目运算(如果数值小于80,替换为0,如果大于80,替换为90)
In [100]: stus_score = np.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]])

In [101]: np.where(stus_score < 80, 0, 90)
Out[101]:
array([[90, 90],
[90, 90],
[90, 0],
[90, 90],
[ 0, 90]])

统计运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 指定轴最大值amax(参数1: 数组; 参数2: axis=0/1; 0表示列1表示行)
stus_score = np.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]])
# 求每一列的最大值(0表示列)
In [106]: print("每一行的最大值为:")
每一行的最大值为:

In [107]: print("每一列的最大值为:")
...: result = np.amax(stus_score, axis=0)
...: print(result)
...: print("每一行的最大值为:")
...: result = np.amax(stus_score, axis=1)
...: print(result)
...:
...:
每一列的最大值为:
[86 88]
每一行的最大值为:
[88 82 84 86 81]
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
# 指定轴最大值amax(参数1: 数组; 参数2: axis=0/1/2;分别对应各个维度)
In [108]: import numpy as np

In [109]: n = np.random.randint(0,150,(4,4,4))

In [110]: n
Out[110]:
array([[[ 91, 45, 10, 51],
[102, 88, 129, 100],
[148, 72, 52, 114],
[ 99, 5, 67, 26]],

[[ 23, 102, 125, 116],
[140, 61, 107, 15],
[ 39, 125, 139, 38],
[ 95, 148, 100, 109]],

[[ 92, 68, 140, 75],
[ 49, 113, 68, 70],
[149, 107, 78, 69],
[120, 109, 27, 138]],

[[126, 79, 113, 89],
[ 29, 126, 3, 90],
[ 40, 23, 20, 14],
[ 72, 38, 99, 55]]])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
In [111]: n.max(axis=0)
Out[111]:
array([[126, 102, 140, 116],
[140, 126, 129, 100],
[149, 125, 139, 114],
[120, 148, 100, 138]])

In [112]: n.max(axis=1)
Out[112]:
array([[148, 88, 129, 114],
[140, 148, 139, 116],
[149, 113, 140, 138],
[126, 126, 113, 90]])

In [113]: n.max(axis=2)
Out[113]:
array([[ 91, 129, 148, 99],
[125, 140, 139, 148],
[140, 113, 149, 138],
[126, 126, 40, 99]])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 指定轴最小值amin
In [114]: stus_score = np.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]])
# 求每一行的最小值(0表示列)
In [115]: print("每一列的最小值为:")
...: result = np.amin(stus_score, axis=0)
...: print(result)
...:
...: # 求每一行的最小值(1表示行)
...: print("每一行的最小值为:")
...: result = np.amin(stus_score, axis=1)
...: print(result)
...:
...:
每一列的最小值为:
[75 75]
每一行的最小值为:
[80 81 75 83 75]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 指定轴平均值mean
In [116]: stus_score = np.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]])
In [117]: # 求每一行的平均值(0表示列)
...: print("每一列的平均值:")
...: result = np.mean(stus_score, axis=0)
...: print(result)
...:
...: # 求每一行的平均值(1表示行)
...: print("每一行的平均值:")
...: result = np.mean(stus_score, axis=1)
...: print(result)
...:
...:
每一列的平均值:
[81.4 81.6]
每一行的平均值:
[84. 81.5 79.5 84.5 78.]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 方差std
In [118]: stus_score = np.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]])

In [119]: # 求每一行的方差(0表示列)
...: print("每一列的方差:")
...: result = np.std(stus_score, axis=0)
...: print(result)
...:
...: # 求每一行的方差(1表示行)
...: print("每一行的方差:")
...: result = np.std(stus_score, axis=1)
...: print(result)
...:
...:
每一列的方差:
[3.77359245 4.1761226 ]
每一行的方差:
[4. 0.5 4.5 1.5 3. ]

数组运算

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
# 数组与数的运算
In [120]: import numpy as np

In [121]: stus_score = np.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]])

In [122]: print("加之前:")
...: print(stus_score)
...:
...: #为所有平时成绩都加5分
...: stus_score[:,0]=stus_score[:,0]+5
...: print("加之后:")
...: print(stus_score)
...:
...:
加之前:
[[80 88]
[82 81]
[84 75]
[86 83]
[75 81]]
加之后:
[[85 88]
[87 81]
[89 75]
[91 83]
[80 81]]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 数组也支持加减乘除运算
In [123]: import numpy as np

In [124]: a = np.array([1,2,3,4])
...: b = np.array([10,20,30,40])
...: c = a + b
...: d = a - b
...: e = a * b
...: f = a / b
...: print("a+b=",c)
...: print("a-b=",d)
...: print("a*b=",e)
...: print("a/b=",f)
...:
...:
a+b= [11 22 33 44]
a-b= [ -9 -18 -27 -36]
a*b= [ 10 40 90 160]
a/b= [0.1 0.1 0.1 0.1]

矩阵运算np.dot()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 计算规则(计算学生总成绩)
#(M行,N列)*(N行,Z列)=(M行,Z列)
In [125]: import numpy as np

In [126]: stus_score = np.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]])
...: #平时成绩占40%,期末成绩占60%,计算结果
...: q = np.array([[0.4],[0.6]])
...: result = np.dot(stus_score,q)
...: print("最终结果为:")
...: print(result)
...:
...:
最终结果为:
[[84.8]
[81.4]
[78.6]
[84.2]
[78.6]]
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
# 矩阵拼接
## 矩阵垂直拼接
In [127]: print("v1为:")
...: v1 = [[0, 1, 2, 3, 4, 5],
...: [6, 7, 8, 9, 10, 11]]
...: print(v1)
...: print("v2为:")
...: v2 = [[12, 13, 14, 15, 16, 17],
...: [18, 19, 20, 21, 22, 23]]
...: print(v2)
...:
v1为:
[[0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11]]
v2为:
[[12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23]]

# 垂直拼接
In [128]: result = np.vstack((v1, v2))
...: print("v1和v2垂直拼接的结果为")
...: print(result)
...:
...:
v1和v2垂直拼接的结果为
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 矩阵水平拼接
In [129]: print("v1为:")
...: v1 = [[0, 1, 2, 3, 4, 5],
...: [6, 7, 8, 9, 10, 11]]
...: print(v1)
...: print("v2为:")
...: v2 = [[12, 13, 14, 15, 16, 17],
...: [18, 19, 20, 21, 22, 23]]
...: print(v2)
...:
v1为:
[[0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11]]
v2为:
[[12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23]]

# 垂直拼接
In [130]: result = np.hstack((v1, v2))
...: print("v1和v2水平拼接的结果为")
...: print(result)
...:
...:
v1和v2水平拼接的结果为
[[ 0 1 2 3 4 5 12 13 14 15 16 17]
[ 6 7 8 9 10 11 18 19 20 21 22 23]]

矩阵的广播

  • ndarray广播的两条规则:
    • 规则一:为缺失的维度补1
    • 规则二:假定缺失元素用已有值填充
1
2
3
4
5
6
7
8
9
10
11
#实例1:m = np.ones((2,3)) a = np.arange(3)求m+a
In [131]: import numpy as np

In [132]: m = np.ones((2,3))
...: a = np.arange(3)
...: display(m,a)
...:
...:
array([[1., 1., 1.],
[1., 1., 1.]])
array([0, 1, 2])
1
2
3
4
5
#numpy广播,维度不同,自动补全
In [133]: m + a
Out[133]:
array([[1., 2., 3.],
[1., 2., 3.]])
1
2
3
4
5
6
7
8
9
10
#实例2:a = np.arange(3).reshape((3,1)) b = np.arange(3) 求a+b
In [134]: a = np.arange(3).reshape((3,1))
...: b = np.arange(3)
...: display(a,b)
...:
...:
array([[0],
[1],
[2]])
array([0, 1, 2])
1
2
3
4
5
In [135]: a + b
Out[135]:
array([[0, 1, 2],
[1, 2, 3],
[2, 3, 4]])

六、排序

1.快速排序

  • np.sort()与ndarray.sort(),区别:
    • np.sort()不改变输入
    • ndarray.sort()本地处理,不占用空间,改变输入
1
2
3
4
5
6
7
8
9
10
11
12
13
In [136]: n1 = np.random.randint(0,150,size=15)

In [137]: n1
Out[137]:
array([ 80, 11, 31, 68, 83, 73, 42, 6, 40, 125, 147, 147, 88,
117, 85])

In [138]: n2 = n1.sort()

In [139]: display(n1,n2)
array([ 6, 11, 31, 40, 42, 68, 73, 80, 83, 85, 88, 117, 125,
147, 147])
None
1
2
3
4
5
6
7
8
In [140]: n3 = np.sort(n1)
...: display(n1,n3)
...:
...:
array([ 6, 11, 31, 40, 42, 68, 73, 80, 83, 85, 88, 117, 125,
147, 147])
array([ 6, 11, 31, 40, 42, 68, 73, 80, 83, 85, 88, 117, 125,
147, 147])

2.部分排序

  • np.partition(a,k)
    • 当k为正时:我们想要得到最小的k个数
    • 当k为负时:我们想要得到最大的k个数
1
2
3
4
5
6
In [141]: n4 = np.random.randint(0,150,size=20)

In [142]: n4
Out[142]:
array([ 37, 74, 41, 53, 31, 11, 23, 108, 12, 128, 27, 88, 74,
114, 97, 127, 60, 47, 130, 135])
1
2
3
4
In [143]: np.partition(n4,-5)
Out[143]:
array([ 37, 12, 41, 27, 31, 11, 23, 47, 74, 60, 53, 74, 88,
97, 108, 114, 127, 128, 130, 135])
1
2
3
4
In [144]: np.partition(n4,5)
Out[144]:
array([ 12, 23, 11, 27, 31, 37, 41, 47, 108, 74, 53, 88, 74,
114, 97, 127, 60, 128, 130, 135])
1
2
3
#取数组中最大的k个数
In [145]: np.partition(n4,-2)[-2:]
Out[145]: array([130, 135])

numpy案例

  • 使用numpy将图片进行翻转
1
2
3
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
1
2
dianxin = plt.imread('./image/dianxin.jpg')
plt.imshow(dianxin)
1
<matplotlib.image.AxesImage at 0x17f47d25630>

1
2
3
#将图片在竖直方向翻转
dianxin1 = dianxin[::-1]
plt.imshow(dianxin1)
1
<matplotlib.image.AxesImage at 0x17f47b61278>

1
2
3
#在水平方向翻转
dianxin2 = dianxin[::,::-1]
plt.imshow(dianxin2)
1
<matplotlib.image.AxesImage at 0x17f48df3320>

1
2
3
# 即在水平方向翻转又在垂直方向翻转
dianxin3 = dianxin[::-1,::-1]
plt.imshow(dianxin3)
1
<matplotlib.image.AxesImage at 0x17f48e60a20>

1
2
3
# 改变图片颜色
dianxin4 = dianxin[::,::,-2]
plt.imshow(dianxin4)
1
<matplotlib.image.AxesImage at 0x17f47bb9400>

1
2
3
#修改图片,是图片模糊
dianxin5 = dianxin[::3,::3]
plt.imshow(dianxin5)
1
<matplotlib.image.AxesImage at 0x17f47d3fd68>