意料之外 意外

科学计算包Numpy

Numpy

用于科学计算的python模块,提供了Python中没有的数组对象,支持N维数组运算、处理大型矩阵、成熟的广播函数库、矢量运算、线性代数、傅里叶变换以及随机数生成等功能,并可与C++、FORTRAN等语言无缝结合。

    菜鸟教程:https://www.runoob.com/numpy/numpy-dtype.html

·导入numpy模块(打开cmd窗口)

pip install numpy

·简单应用

import numpy as np

1.生成数组

 1 >>> np.array([1, 2, 3, 4, 5])        # 把列表转换为数组
 2 array([1, 2, 3, 4, 5])
 3 >>> np.array((1, 2, 3, 4, 5))        # 把元组转换成数组
 4 array([1, 2, 3, 4, 5])
 5 >>> np.array(range(5))               # 把range对象转换成数组
 6 array([0, 1, 2, 3, 4])
 7 >>> np.array([[1, 2, 3], [4, 5, 6]]) # 二维数组
 8 array([[1, 2, 3],
 9        [4, 5, 6]])
10 >>> np.arange(8)                     # 类似于内置函数range()
11 array([0, 1, 2, 3, 4, 5, 6, 7])
12 >>> np.arange(1, 10, 2)              #从1到10(包括1,不包括10),步长为2
13 array([1, 3, 5, 7, 9])
14 >>> np.linspace(0, 10, 11)        
15       # 等差数组,包含11个数,从0到10(包括0,也包括10,闭区间),平均分为11个数字array([  0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.])
16 >>> np.linspace(0, 10, 11, endpoint=False) # 不包含终点
17 array([ 0.        ,  0.90909091,  1.81818182,  2.72727273,  3.63636364,
18         4.54545455,  5.45454545,  6.36363636,  7.27272727,  8.18181818,
19         9.09090909])
20 >>> np.logspace(0, 100, 10)  # 对数数组,从0到100,取10个数,返回10个数分别作为幂,计算基为10的结果数组
21 array([ 1.00000000e+000,   1.29154967e+011,   1.66810054e+022,
22         2.15443469e+033,   2.78255940e+044,   3.59381366e+055,
23         4.64158883e+066,   5.99484250e+077,   7.74263683e+088,
24         1.00000000e+100])
25 >>>np.logspace(0, 10, 5)
26 array([1.00000000e+00, 3.16227766e+02, 1.00000000e+05, 3.16227766e+07,
27        1.00000000e+10])
28 >>> np.logspace(1,6,5, base=2) # 对数数组,相当于2 ** np.linspace(1,6,5)
29 array([  2.        ,   4.75682846,  11.3137085 ,  26.90868529,  64.        ])
30 >>>np.logspace(1,5,5,base=2)
31 array([ 2.,  4.,  8., 16., 32.])
32 >>>np.logspace(1,6,3,base=2)
33 array([ 2.       , 11.3137085, 64.       ])
34 >>> np.zeros(3)                     # 全0一维数组
35 array([ 0.,  0.,  0.])
36 >>> np.ones(3)                      # 全1一维数组
37 array([ 1.,  1.,  1.])
38 >>> np.zeros((3,3))              # 全0二维数组,3行3列
39 array([[ 0.,  0.,  0.],
40        [ 0.,  0.,  0.],
41        [ 0.,  0.,  0.]])
42 >>> np.zeros((3,1))              # 全0二维数组,3行1列
43 array([[ 0.],
44        [ 0.],
45        [ 0.]])
46 >>> np.zeros((1,3))              # 全0二维数组,1行3列
47 array([[ 0.,  0.,  0.]])
48 >>> np.ones((3,3))               # 全1二维数组
49 array([[ 1.,  1.,  1.],
50        [ 1.,  1.,  1.],
51        [ 1.,  1.,  1.]])
52 >>> np.ones((1,3))  # 全1二维数组
53 array([[ 1.,  1.,  1.]])
54 >>> np.identity(3)  # 单位矩阵
55 array([[ 1.,  0.,  0.],
56        [ 0.,  1.,  0.],
57        [ 0.,  0.,  1.]])
58 >>> np.identity(2)
59 array([[ 1.,  0.],
60        [ 0.,  1.]])
61 >>> np.empty((3,3)) # 空数组,只申请空间而不初始化,元素值是不确定的
62 array([[ 0.,  0.,  0.],
63        [ 0.,  0.,  0.],
64        [ 0.,  0.,  0.]])
65 >>> np.random.randint(0, 50, 5)   # 随机数组,5个0到50之间的数字
66 array([13, 47, 31, 26,  9])
67 >>> np.random.randint(0, 50, (3,5)) # 3行5列
68 array([[34,  2, 33, 14, 40],
69        [ 9,  5, 10, 27, 11],
70        [26, 17, 10, 46, 30]])
71 >>> np.random.rand(10)
72 array([ 0.98139326,  0.35675498,  0.30580776,  0.30379627,  0.19527425,
73         0.59159936,  0.31132305,  0.20219211,  0.20073821,  0.02435331])
74 >>> np.random.standard_normal(5)     # 从标准正态分布中随机采样
75 array([ 2.82669067,  0.9773194 , -0.72595951, -0.11343254,  0.74813065])
View Code 

 

2.数组与数值的算术运算

>>> a=np.array((1,2,3,4,5))
>>> a+2
array([3, 4, 5, 6, 7])
>>> a-2
array([-1,  0,  1,  2,  3])
>>> a*2
array([ 2,  4,  6,  8, 10])
>>> a/2
array([0.5, 1. , 1.5, 2. , 2.5])
>>> a//2
array([0, 1, 1, 2, 2], dtype=int32)
>>> a**2
array([ 1,  4,  9, 16, 25], dtype=int32)

  

3.数组与数组的算术运算

>>> a=np.array((1,2,3))
>>> b=np.array(([1,2,3],[4,5,6],[7,8,9]))
>>> a+b
array([[ 2,  4,  6],
       [ 5,  7,  9],
       [ 8, 10, 12]])
>>> a-b
array([[ 0,  0,  0],
       [-3, -3, -3],
       [-6, -6, -6]])
>>> a*b
array([[ 1,  4,  9],
       [ 4, 10, 18],
       [ 7, 16, 27]])
>>> a//b
array([[1, 1, 1],
       [0, 0, 0],
       [0, 0, 0]], dtype=int32)

  

4.二维数组转置

>>> b=np.array(([1,2,3],[4,5,6],[7,8,9]))
>>> b
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
>>> print(b.T)
[[1 4 7]
 [2 5 8]
 [3 6 9]]

  

5.向量点积

>>> a=np.array((5,6,7))
>>> b=np.array((6,6,6))
>>> np.dot(a,b)
108

  

6.数组元素访问

>>> b=np.array(([1,2,3],[4,5,6],[7,8,9]))
>>> b[0,0]
1
>>> b[0][2]
3

  

多元素同时访问

>>> x = np.arange(0,100,10,dtype=np.floating)
>>> x
array([  0.,  10.,  20.,  30.,  40.,  50.,  60.,  70.,  80.,  90.])
>>> x[[1, 3, 5]]          # 同时访问多个位置上的元素
array([ 10.,  30.,  50.])

  

7.三角函数运算

>>> b=np.array(([1,2,3],[4,5,6],[7,8,9]))
>>> np.sin(b)
array([[ 0.84147098,  0.90929743,  0.14112001],
       [-0.7568025 , -0.95892427, -0.2794155 ],
       [ 0.6569866 ,  0.98935825,  0.41211849]])

  

8.四舍五入

>>> np.round(np.sin(b))
array([[ 1.,  1.,  0.],
       [-1., -1., -0.],
       [ 1.,  1.,  0.]])

  

9.对矩阵不同维度上的元素进行求和

>>> x=np.arange(0,10).reshape(2,5)
>>> x
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
>>> np.sum(x)
45
>>> np.sum(x,axis=0)   #每列求和
array([ 5,  7,  9, 11, 13])
>>> np.sum(x,axis=1)  #每行求和
array([10, 35])

  

10.计算矩阵不同维度上元素的均值

>>> np.average(x,axis=0)
array([2.5, 3.5, 4.5, 5.5, 6.5])
>>> np.average(x,axis=1)
array([2., 7.])

  

11.计算数据的标准差与方差

>>> x=np.random.randint(0,10,size=(3,3))
>>> x
array([[5, 3, 5],
       [3, 6, 2],
       [6, 0, 9]])
>>> np.std(x)    #标准差
2.494438257849294
>>> np.std(x,axis=1)  #列行标准差
array([0.94280904, 1.69967317, 3.74165739]) >>> np.var(x) #方差 6.222222222222222

  

12.对矩阵不同维度上的元素求最大值

 

>>> x=np.random.randint(0,10,size=(3,3))
>>> x
array([[2, 6, 9],
       [1, 8, 3],
       [0, 9, 8]])
>>> np.max(x)
9
>>> np.max(x,axis=1) #每列最大值
array([9, 8, 9])

 

 

 

13.对矩阵不同维度上的元素进行排序

 

>>> np.sort(x)
array([[2, 6, 9],
       [1, 3, 8],
       [0, 8, 9]])
>>> np.sort(x,axis=0)
array([[0, 6, 3],
       [1, 8, 8],
       [2, 9, 9]])

 

14.生成特殊数组

 

>>> np.empty((3,3)) #只申请空间,不初始化,速度很快
array([[0.00000000e+000, 0.00000000e+000, 0.00000000e+000],
       [0.00000000e+000, 0.00000000e+000, 4.82208070e-321],
       [1.86918698e-306, 1.78021662e-306, 2.46155235e-312]])

 

 

 

15.改变数组大小

 

>>> a=np.arange(1,11,1)
>>> a
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
>>> a.shape=2,5
>>> a
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10]])
>>> a.shape=5,-1  #-1表示自动计算
>>> a
array([[ 1,  2],
       [ 3,  4],
       [ 5,  6],
       [ 7,  8],
       [ 9, 10]])
>>> a.reshape(2,5)
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10]])

 

 

 

16.切片操作

 

>>> a=np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a[::-1]
array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
>>> a[::2]
array([0, 2, 4, 6, 8])

>>> c=np.array([[j*10+ i for i in range(6)] for j in range (6)])
>>> c
array([[ 0,  1,  2,  3,  4,  5],
       [10, 11, 12, 13, 14, 15],
       [20, 21, 22, 23, 24, 25],
       [30, 31, 32, 33, 34, 35],
       [40, 41, 42, 43, 44, 45],
       [50, 51, 52, 53, 54, 55]])
>>> c[0,3:5]  #取第0行第三个和第四个元素
array([3, 4])

 

 

 

17.布尔运算

 

>>> x=np.random.rand(10)
>>> x
array([0.10905435, 0.57768227, 0.18788365, 0.23399672, 0.93576621,
       0.62251011, 0.54649539, 0.37180411, 0.72779445, 0.05535632])
>>> x>0.5
array([False,  True, False, False,  True,  True,  True, False,  True,
       False])
>>> x[x>0.5]  #取出所有大于0.5的元素
array([0.57768227, 0.93576621, 0.62251011, 0.54649539, 0.72779445])
>>> np.array([1,2,3]) < np.array([3,2,1])
array([ True, False, False])
>>> np.array([1,2,3]) == np.array([3,2,1])
array([False,  True, False])

 

 

 

18.取整运算

 

>>> x=np.random.rand(10)*50
>>> x
array([19.13213223, 38.14702133, 41.30754565, 19.51765474, 19.73843457,
       25.66530995, 34.74361578, 12.44682723,  6.03817843, 34.18593124])
>>> np.array([t-int(t) for t in x])    #获取小数部分
array([0.13213223, 0.14702133, 0.30754565, 0.51765474, 0.73843457,
       0.66530995, 0.74361578, 0.44682723, 0.03817843, 0.18593124])

 

 

 

19.广播

 

>>> a=np.arange(0,60,10).reshape(-1,1)
>>> b=np.arange(0,6)
>>> a
array([[ 0],
       [10],
       [20],
       [30],
       [40],
       [50]])
>>> b
array([0, 1, 2, 3, 4, 5])
>>> a+b
array([[ 0,  1,  2,  3,  4,  5],
       [10, 11, 12, 13, 14, 15],
       [20, 21, 22, 23, 24, 25],
       [30, 31, 32, 33, 34, 35],
       [40, 41, 42, 43, 44, 45],
       [50, 51, 52, 53, 54, 55]])

 

 

 

20.分段函数

 

>>> x=np.random.randint(0,10,size=(1,10))
>>> x
array([[4, 4, 8, 9, 0, 0, 4, 0, 3, 5]])
>>> np.where(x<5,0,1)  #选出小于5,0,1的数
array([[0, 0, 1, 1, 0, 0, 0, 0, 0, 1]])
>>>np.piecewise(x,[x<7,x>4],[lambda x:x*2,lambda x:x*3])  #小于7的数乘2,大于4的数乘3
array([[ 8,  8, 24, 27,  0,  0,  8,  0,  6, 15]])

 

 

 

21.计算唯一值以及出现次数

 

>>> x=np.random.randint(0,10,10)
>>> x
array([1, 1, 0, 2, 7, 1, 6, 6, 9, 7])
>>> np.unique(x)    #计算唯一值
array([0, 1, 2, 6, 7, 9])
>>> np.bincount(x)  #计算出现的次数,但是因为访问是无序的,所以最后并不是顺序计数
array([1, 3, 1, 0, 0, 0, 2, 2, 0, 1], dtype=int64)

 

 

 

22.计算加权平均值

 

>>> y=np.array([round(i,1) for i in list (np.random.random(10))])
>>> y
array([0.2, 0. , 0.6, 0.3, 0.7, 0. , 0.7, 0.4, 0.8, 0.7])   #随机生成10个0-1之间的带一位小数的数
>>> np.sum(x*y)/np.sum(np.bincount(x))   #平均值
2.44

 

 

 

23.矩阵运算

  

>>> a_list=[3,5,7]
>>> a_mat=np.matrix(a_list)   #设置为矩阵库
>>> a_mat
matrix([[3, 5, 7]])
>>> np.shape(a_mat)   #矩阵为一行三列
(1, 3)
>>> b_mat=np.matrix((1,2,3))
>>> b_mat
matrix([[1, 2, 3]])
>>> a_mat * b_mat.T  #矩阵乘法
matrix([[34]])
>>> a_mat.argsort()  #返回的是数组值从小到大的索引值
matrix([[0, 1, 2]], dtype=int64)
>>> a_mat.sum()
15
>>> a_mat
matrix([[3, 5, 7]])
>>> a_mat.mean()
5.0
>>> a_mat.max()
7
posted @ 2019-12-05 17:07  陌默安  阅读(816)  评论(0编辑  收藏  举报