当前位置:   article > 正文

1 | NumPy入门指南_刘润森转载

刘润森转载

Python数据分析

2.1 Numpy

NumPy 软件包是 Python 生态系统中数据分析、机器学习和科学计算的主力军。它极大地简化了向量和矩阵的操作处理。Python 的一些主要软件包(如 scikit-learn、scipy、pandas 和 tensorflow)都以 NumPy 作为其架构的基础部分。除了能对数值数据进行切片(slice)和切块(dice)之外,使用 NumPy 还能为处理和调试上述库中的高级实例带来极大便利。

本节将介绍使用 NumPy 的一些主要常见方法

示例讲解

2.1.1 创建,修改array,shape与reshape函数

>>> # 导入numpy
>>> import numpy as np
>>> a = np.array([1, 2, 3])
>>> b = np.array([[1, 2, 3], [4, 5, 6]])
>>> a.dtype
int32
>>> b.shape
(2 3)
>>> 将b的第一行第一列的5改为10
>>> b[1,1]=10
>>> b
array([[ 1,  2,  3],
       [ 4, 10,  6]])
>>> b.reshape(3,2)
array([[ 1,  2],
       [ 3,  4],
       [10,  6]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

函数 shape 属性获得数组的大小,通过 dtype 获得元素的属性。如果你想对数组里的数值进行修改的话,直接赋值即可,注意下标是从 0 开始计的。

2.1.2 数组切片和选取

Numpy的切片和Python列表完全一样。一个完整的切片表达式包含两个“:”,用于分隔三个参数(start_index、end_index、step),当只有一个“:”时,默认第三个参数step=1。

如下图2-5所示,以a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]为例:

>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a * 10 
array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])
>>> a[2:8:2]
array([2, 4, 6])
>>> a[3:5] = a[3:5] *10
>>> a
array([ 0,  1,  2, 30, 40,  5,  6,  7,  8,  9])
>>> import numpy as np
>>> # 二维
>>> b = np.array([[1,2,3],[4,5,6]])
>>> b
array([[1, 2, 3],
       [4, 5, 6]])
>>> b[:,1]
array([2, 5])
>>> b[:,0:2]
array([[1, 2],
       [4, 5]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

2.1.3 数组的布尔值运用

布尔值也是Python中的一种数据类型,专门用来用于些逻辑判断。常用的布尔值分别有:~ 反,& 并,| 或 。

现在我们新建一个数组 a,现在取出其中元素值大于3且小于6 的所有元素,并改为0,其他为1

>>> a = np.arange(0,10,1)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.sum(a>5)
4
>>> np.sum(~(a>5))
6
>>> a[(a>3)&(a<6)] = 0
>>> a[~(a>3)&(a<6)] = 1
>>> a
array([1, 1, 1, 1, 1, 1, 6, 7, 8, 9])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2.1.4 axis的应用

如下图2-6所示,axis实际上就是表示轴。对于一个二维空间,axis=1代表横轴,axis=0按照竖轴。

>>> a = np.array([[1,4],[3,2]])
>>> b = np.array([[5,6],[7,8]])
>>> concatenate的将两个Array聚合起来
>>> np.concatenate((a,b),axis=0)
array([[1, 4],
       [3, 2],
       [5, 6],
       [7, 8]])
>>> np.concatenate((a,b),axis=1)
array([[1, 4, 5, 6],
       [3, 2, 7, 8]])
>>> 如果排序的时候,没有指定axis,默认axis=1
>>> np.sort(a)
array([[1, 4],
       [2, 3]])
>>> np.sort(a, axis=0)
array([[1, 2],
       [3, 4]])
>>> 如果需要运算,需要指定对应的axis
>>> a.sum()
10
>>> a.sum(axis=0)
array([4, 6])
>>> a.sum(axis=1)
array([5, 5])
>>> 通过ndim查看array的维度
>>> a.ndim
2
  • 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

2.1.5 数列的创建和算术运算

等比数列:logspace中,开始点和结束点是10的幂,0代表10的0次方,9代表10的9次方。生成从10的a次方到10的b次方之间按对数等分的n个元素的行向量。

等差数列:linspace 是 linear space 的缩写,代表线性等分向量的含义。linspace() 通过指定 初始值、终值、元素个数 来创建等差数列的一维数组。注意:这个区间的端点可以任意的被排除在外。

通过 NumPy 可以自由地创建等差数组,同时也可以进行加、减、乘、除、求 n 次方和取余数。同时也可以进行加、减、乘、除、求 n 次方和取余数

>>> # 在100和1000中生成num=4的等比序列
>>> np.logspace(2.0, 3.0, num=4)
array([ 100.        ,  215.443469  ,  464.15888336, 1000.        ])
>>> # endpoint=Falseb表示1000不能在序列中
>>> np.logspace(2.0, 3.0, num=4, endpoint=False)
array([100.        ,  177.827941  ,  316.22776602,  562.34132519])
>>> # base=2.0表示不再以10的幂,而是以2作为幂
>>> np.logspace(2.0, 3.0, num=4, base=2.0)
array([4.        ,  5.0396842 ,  6.34960421,  8.        ])
>>> a = np.linspace(1,10,5)
>>> b = np.linspace(10,1,5)
>>> a
array([ 1.  ,  3.25,  5.5 ,  7.75, 10.  ])
>>> b
array([10.  ,  7.75,  5.5 ,  3.25,  1.  ])
>>> np.add(a, b)  #加法
array([11., 11., 11., 11., 11.])
>>> np.subtract(a, b) #减法
array([-9. , -4.5,  0. ,  4.5,  9. ])
>>> np.multiply(a, b) #乘法
array([10.    , 25.1875, 30.25  , 25.1875, 10.    ])
>>> np.divide(a, b)  #除法
array([ 0.1       ,  0.41935484,  1.        ,  2.38461538, 10.        ])
>>> np.power(a,b)   #乘方
array([1.00000000e+00, 9.27034822e+03, 1.18030648e+04, 7.76659275e+02,
       1.00000000e+01])  
>>> np.remainder(a, b)  #取余数
array([1.  , 3.25, 0.  , 1.25, 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

2.1.6 重要random的函数

rand:根据给定维度生成[0,1)之间的数据,包含0,不包含1

randn:返回均值=0,标准差=1,具有标准正态分布。

normal:normal是正态分布,但可以修改均值和标准差,第一个是均值,第二个是标准差,还可以传入size

randint:返回随机整数,范围区间为[low,high),包含low,不包含high

choice:从给定的区间生成相对应个随机数

>>> np.random.rand(3,4)
array([[0.00910588, 0.26719767, 0.96195156, 0.66325403],
       [0.77108254, 0.73961889, 0.4332318 , 0.6130871 ],
       [0.24454375, 0.96344155, 0.91942036, 0.16383334]])
>>>np.random.randn(3,4) 
array([[0.31124855, 0.3970361 , 0.86046835, 0.36587692],
       [0.94543601, 0.84770308, 0.13784751, 0.69106204],
       [0.80672147, 0.78469807, 0.12474456, 0.38386812]])
>>> np.random.normal(5,1,size=(3, 4))
array([[5.05484712, 5.11948961, 4.74160469, 5.73573086],
       [4.93939144, 6.52482878, 3.83668001, 6.62767368],
       [4.74056406, 4.00017621, 6.32218076, 5.48900825]])
>>> np.random.randint(1, 10, 10)
array([3, 2, 6, 5, 7, 6, 6, 5, 1, 3])
>>> # 从给定的0到3中生成3个随机数
>>> np.random.choice(3,3) 
array([2, 0, 2])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

如果想每次都固定随机数,需要设置seed随机种子

>>>for i in range(5):
	  np.random.seed(1) # 当这里有数时,生成相同的随机数
	  a = np.random.randint(1,10,10)
      print(a)
>>> [6 9 6 1 1 2 8 7 3 5]
[6 9 6 1 1 2 8 7 3 5]
[6 9 6 1 1 2 8 7 3 5]
[6 9 6 1 1 2 8 7 3 5]
[6 9 6 1 1 2 8 7 3 5]      
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

参数相同时使得每次生成的随机数相同;当参数不同或者无参数时,作用与numpy.random.randint()函数相同,即多次生成随机数且每次生成的随机数都不同。

2.1.7 统计函数

如果你想要对数据有更清晰的认识,就需要对这些数据进行描述性的统计分析,比如了解这些数据中的最大值、最小值、平均值,是否符合正态分布,方差、标准差多少等等。下面来介绍下在 NumPy 中如何使用统计函数。

>>> a = np.array([[1,2,3], [4,5,6], [7,8,9]])
>>> # 最大值函数amax(),最小值函数amin()
>>> np.amin(a)
1
>>> #0表示axis=0
>>> np.amin(a,0)
array([1, 2, 3])
>>> #1表示axis=1
>>> np.amin(a,1)
array([1, 4, 7])
>>> np.amax(a)
9
>>> np.amax(a,0)
array([7, 8, 9])
>>> #最大值与最小值之差 ptp()
>>> np.ptp(a)
8
>>> np.ptp(a,0)
array([6, 6, 6])
>>> np.ptp(a,1)
array([2, 2, 2])
>>> #中位数 median()
>>> np.median(a)
5.0
>>> np.median(a, axis=0)
array([4., 5., 6.])
>>> np.median(a, axis=1)
array([2., 5., 8.])
>>> # 平均数 mean()
>>> np.mean(a)
5.0
>>> np.mean(a, axis=0)
array([4., 5., 6.])
>>> np.mean(a, axis=1)
array([2., 5., 8.])
>>> # 标准差 std()、方差 var()
>>> np.std(a)
2.581988897471611
>>> np.var(a)
6.666666666666667
>>> # 加权平均值 average()
  • 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
  • 38
  • 39
  • 40
  • 41

average() 函数可以求加权平均,加权平均的意思就是每个元素可以设置个权重,默认情况下每个元素的权重是相同的,所以 np.average(a)=(1+2+3+4)/4=2.5,你也可以指定权重数组 wts=[1,2,3,4],这样加权平均 np.average(a,weights=wts)=(1*1+2*2+3*3+4*4)/(1+2+3+4)=3.0。

>>> a = np.array([1,2,3,4])
>>> wts = np.array([1,2,3,4])
>>> np.average(a)
2.5
>>> np.average(a,weights=wts)
3.0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

percentile() 代表着第 p 个百分位数,这里 p 的取值范围是 0-100,如果 p=0,那么就是求最小值,如果 p=50 就是求平均值,如果 p=100 就是求最大值。同样你也可以求得在 axis=0 和 axis=1 两个轴上的 p % 的百分位数。

>>> #统计数组的百分位数 percentile()
>>> a = np.array([[1,2,3], [4,5,6], [7,8,9]])
>>> np.percentile(a, 50)
5.0
>>> np.percentile(a, 50, axis=0)
array([4., 5., 6.])
>>> np.percentile(a, 50, axis=1)
array([2., 5., 8.])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.1.8 矩阵运算

矩阵都创建可以通matrix和mat创建,matrix和mat等价。

矩阵的换行必须是用分号(;)隔开,内部数据必须为字符串形式,矩阵的元素之间必须以空格隔开。

>>> np.matrix('1 2 7; 3 4 8; 5 6 9')
matrix([[1, 2, 7],
        [3, 4, 8],
        [5, 6, 9]])
>>> np.mat('1 2 7; 3 4 8; 5 6 9')
matrix([[1, 2, 7],
        [3, 4, 8],
        [5, 6, 9]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

np.eye返回的是一个二维2的数组对角线的地方为1,其余的地方为0。

>>> np.matrix(np.eye(4)) #np.mat同样可以创建矩阵
matrix([[1., 0., 0., 0.],
        [0., 1., 0., 0.],
        [0., 0., 1., 0.],
        [0., 0., 0., 1.]])
>>> np.array(np.eye(4))
array([[1., 0., 0., 0.],
       [0., 1., 0., 0.],
       [0., 0., 1., 0.],
       [0., 0., 0., 1.]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

矩阵matrix和数组array是NumPy里的两种数据类型。下面将区别数组和矩阵

matrix.T:返回矩阵的转置矩阵 (但是数组同样可以转置)
matrix.I :返回矩阵的逆矩阵(这是只有矩阵才有的)

>>> a = np.random.randn(2,3)
>>> a.T
array([[-0.43483687, -0.872943  ],
       [-0.55062188, -0.58759283],
       [ 0.56244839, -0.98155603]])
>>> a.I
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'numpy.ndarray' object has no attribute 'I'
>>> a = np.mat(a)
>>> a.T
matrix([[-0.43483687, -0.872943  ],
        [-0.55062188, -0.58759283],
        [ 0.56244839, -0.98155603]])
>>> a.I
matrix([[-0.46534585, -0.3876139 ],
        [-0.63661088, -0.23732005],
        [ 0.79495043, -0.53199979]])

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

对于矩阵运算,莫过于进行线性代数。NumPy 提供了线性代数函数库 linalg,该库包含了线性代数所需的所有功能,具体对应函数功能如下:

函数描述
diag()以一维数组的形式返回方阵的对角线(或非对角线)元素,或将一维数组转换为方阵(非对角线元素为0)
dot()矩阵乘法
trace()计算对角线元素的和
det()计算矩阵行列式
eig()计算方阵的特征值和特征向量
inv()计算方阵的逆
pinv()计算矩阵的Moore-Penrose伪逆
qr()计算QR分解
svd()计算奇异值分解(SVD)
solve()解线性方程组Ax=b,其中A为一个方阵
lstsq()计算Ax=b的最小二乘解

2.1.9 repeat和tile函数

repeat,英文是重复的意思,是属于ndarray对象的方法,使用它可以将ndarray对象复制多份。

>>> a = np.arange(3)
>>> a
array([0, 1, 2])
>>> # 将a复制3分
>>> a.repeat(3)
array([0, 0, 0, 1, 1, 1, 2, 2, 2])
>>> # 重复复制对应的次数
>>> a.repeat([1,2,3])
array([0, 1, 1, 2, 2, 2])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

tile,英文是瓷砖的意思。顾名思义,这个函数就是把数组像瓷砖一样铺展开来。将原矩阵横向、纵向地复制。

>>> a
array([0, 1, 2])
>>> np.tile(a,2)
array([0, 1, 2, 0, 1, 2])
>>> np.tile(a,(2,2))
array([[0, 1, 2, 0, 1, 2],
       [0, 1, 2, 0, 1, 2]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

如果需要阅读更多的Numpy教程,可以参考Numpy官方文档:https://numpy.org/,

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/837511
推荐阅读
相关标签
  

闽ICP备14008679号