赞
踩
NumPy 软件包是 Python 生态系统中数据分析、机器学习和科学计算的主力军。它极大地简化了向量和矩阵的操作处理。Python 的一些主要软件包(如 scikit-learn、scipy、pandas 和 tensorflow)都以 NumPy 作为其架构的基础部分。除了能对数值数据进行切片(slice)和切块(dice)之外,使用 NumPy 还能为处理和调试上述库中的高级实例带来极大便利。
本节将介绍使用 NumPy 的一些主要常见方法
示例讲解
>>> # 导入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]])
函数 shape 属性获得数组的大小,通过 dtype 获得元素的属性。如果你想对数组里的数值进行修改的话,直接赋值即可,注意下标是从 0 开始计的。
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]])
布尔值也是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])
如下图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
等比数列: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. ])
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])
如果想每次都固定随机数,需要设置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]
参数相同时使得每次生成的随机数相同;当参数不同或者无参数时,作用与numpy.random.randint()函数相同,即多次生成随机数且每次生成的随机数都不同。
如果你想要对数据有更清晰的认识,就需要对这些数据进行描述性的统计分析,比如了解这些数据中的最大值、最小值、平均值,是否符合正态分布,方差、标准差多少等等。下面来介绍下在 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()
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
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.])
矩阵都创建可以通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]])
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.]])
矩阵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]])
对于矩阵运算,莫过于进行线性代数。NumPy 提供了线性代数函数库 linalg,该库包含了线性代数所需的所有功能,具体对应函数功能如下:
函数 | 描述 |
---|---|
diag() | 以一维数组的形式返回方阵的对角线(或非对角线)元素,或将一维数组转换为方阵(非对角线元素为0) |
dot() | 矩阵乘法 |
trace() | 计算对角线元素的和 |
det() | 计算矩阵行列式 |
eig() | 计算方阵的特征值和特征向量 |
inv() | 计算方阵的逆 |
pinv() | 计算矩阵的Moore-Penrose伪逆 |
qr() | 计算QR分解 |
svd() | 计算奇异值分解(SVD) |
solve() | 解线性方程组Ax=b,其中A为一个方阵 |
lstsq() | 计算Ax=b的最小二乘解 |
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])
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]])
如果需要阅读更多的Numpy教程,可以参考Numpy官方文档:https://numpy.org/,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。