本文介绍了一些NumPy基础知识,适合数据科学初学者学习掌握。
NumPy(NumericalPython)是Python中的一个线性代数库。对每一个数据科学或机器学习Python包而言,这都是一个非常重要的库,SciPy(ScientificPython)、Mat-plotlib(plottinglibrary)、Scikit-learn等都在一定程度上依赖NumPy。
对数组执行数学运算和逻辑运算时,NumPy是非常有用的。在用Python对n维数组和矩阵进行运算时,NumPy提供了大量有用特征。
这篇教程介绍了数据科学初学者需要了解的NumPy基础知识,包括如何创建NumPy数组、如何使用NumPy中的广播机制、如何获取值以及如何操作数组。更重要的是,大家可以通过本文了解到NumPy在Python列表中的优势:更简洁、更快速地读写项、更方便、更高效。
本教程将使用Jupyternotebook作为编辑器。
让我们开始吧!
安装NumPy
如果你已经装有Anaconda,那么你可以使用以下命令通过终端或命令提示符安装NumPy:
condainstallnumpy
如果你没有Anaconda,那么你可以使用以下命令从终端上安装NumPy:
pipinstallnumpy
安装好NumPy后,你就可以启动Jupyternotebook开始学习了。接下来从NumPy数组开始。
NumPy数组
NumPy数组是包含相同类型值的网格。NumPy数组有两种形式:向量和矩阵。严格地讲,向量是一维数组,矩阵是多维数组。在某些情况下,矩阵只有一行或一列。
首先将NumPy导入Jupyternotebook:
importnumpyasnp
从Python列表中创建NumPy数组
我们先创建一个Python列表:
my_list=[1,2,3,4,5]
通过这个列表,我们可以简单地创建一个名为my_numpy_list的NumPy数组,显示结果:
my_numpy_list=np.array(my_list)my_numpy_list#Thislineshowtheresultofthearraygenerated
刚才我们将一个Python列表转换成一维数组。要想得到二维数组,我们要创建一个元素为列表的列表,如下所示:
second_list=[[1,2,3],[5,4,1],[3,6,7]]new_2d_arr=np.array(second_list)new_2d_arr#Thislineshowtheresultofthearraygenerated
我们已经成功创建了一个有3行3列的二维数组。
使用arange()内置函数创建NumPy数组
与Python的range()内置函数相似,我们可以用arange()创建一个NumPy数组。
my_list=np.arange(10)#ORmy_list=np.arange(0,10)
这产生了0~10的十个数字。
要注意的是arange()函数中有三个参数。第三个参数表示步长。例如,要得到0~10中的偶数,只需要将步长设置为2就可以了,如下所示:
my_list=np.arange(0,11,2)
还可以创建有7个0的一维数组:
my_zeros=np.zeros(7)
也可以创建有5个1的一维数组:
my_ones=np.ones(5)
同样,我们可以生成内容都为0的3行5列二维数组:
two_d=np.zeros((3,5))
使用linspace()内置函数创建NumPy数组
linspace()函数返回的数字都具有指定的间隔。也就是说,如果我们想要1到3中间隔相等的15个点,我们只需使用以下命令:
lin_arr=np.linspace(1,3,15)
该命令可生成一维向量。
与arange()函数不同,linspace()的第三个参数是要创建的数据点数量。
在NumPy中创建一个恒等矩阵
处理线性代数时,恒等矩阵是非常有用的。一般而言,恒等矩阵是一个二维方矩阵,也就是说在这个矩阵中列数与行数相等。有一点要注意的是,恒等矩阵的对角线都是1,其他的都是0。恒等矩阵一般只有一个参数,下述命令说明了要如何创建恒等矩阵:
my_matrx=np.eye(6)#6isthenumberofcolumns/rowsyouwant
用NumPy创建一个随机数组成的数组
我们可以使用rand()、randn()或randint()函数生成一个随机数组成的数组。
使用random.rand(),我们可以生成一个从0~1均匀产生的随机数组成的数组。
例如,如果想要一个由4个对象组成的一维数组,且这4个对象均匀分布在0~1,可以这样做:
my_rand=np.random.rand(4)
如果我们想要一个有5行4列的二维数组,则:
my_rand=np.random.rand(5,4)my_rand
使用randn(),我们可以从以0为中心的标准正态分布或高斯分布中产生随机样本。例如,我们这样生成7个随机数:
my_randn=np.random.randn(7)my_randn
绘制结果后会得到一个正态分布曲线。
同样地,如需创建一个3行5列的二维数组,这样做即可:
np.random.randn(3,5)
最后,我们可以使用randint()函数生成整数数组。randint()函数最多可以有三个参数:最小值(包含),最大值(不包含)以及数组的大小。
np.random.randint(20)#generatesarandomintegerexclusiveof20np.random.randint(2,20)#generatesarandomintegerincluding2butexcluding20np.random.randint(2,20,7)#generates7randomintegersincluding2butexcluding20
将一维数组转换成二维数组
先创建一个有25个随机整数的一维数组:
arr=np.random.rand(25)
然后使用reshape()函数将其转换为二维数组:
arr.reshape(5,5)
注意:reshape()仅可转换成行列数目相等,且行列数相乘后要与元素数量相等。上例中的arr包含25个元素,因此只能重塑为5*5的矩阵。
定位NumPy数组中的最大值和最小值
使用max()和min()函数,我们可以得到数组中的最大值或最小值:
arr_2=np.random.randint(0,20,10)arr_2.max()#Thisgivesthehighestvalueinthearrayarr_2.min()#Thisgivesthelowestvalueinthearray
使用argmax()和argmin()函数,我们可以定位数组中最大值和最小值的索引:
arr_2.argmax()#Thisshowstheindexofthehighestvalueinthearrayarr_2.argmin()#Thisshowstheindexofthelowestvalueinthearray
假设存在大量数组,而你需要弄清楚数组的形态,你想知道这个数组是一维数组还是二维数组,只需要使用shape函数即可:
arr.shape
从NumPy数组中索引/选择多个元素(组)
在NumPy数组中进行索引与Python类似,只需输入想要的索引即可:
my_array=np.arange(0,11)my_array[8]#Thisgivesusthevalueofelementatindex8
为了获得数组中的一系列值,我们可以使用切片符「:」,就像在Python中一样:
my_array[2:6]#Thisreturnseverythingfromindex2to6(exclusive)my_array[:6]#Thisreturnseverythingfromindex0to6(exclusive)my_array[5:]#Thisreturnseverythingfromindex5totheendofthearray.
类似地,我们也可以通过使用[][]或[,]在二维数组中选择元素。
使用[][]从下面的二维数组中抓取出值「60」:
two_d_arr=np.array([[10,20,30],[40,50,60],[70,80,90]])two_d_arr[1][2]#Thevalue60appearsisinrowindex1,andcolumnindex2
使用[,]从上面的二维数组中抓取出值「20」:
two_d_arr[0,1]
也可以用切片符抓取二维数组的子部分。使用下面的操作从数组中抓取一些元素:
two_d_arr[:1,:2]#Thisreturns[[10,20]]two_d_arr[:2,1:]#Thisreturns([[20,30],[50,60]])two_d_arr[:2,:2]#Thisreturns([[10,20],[40,50]])
我们还可以索引一整行或一整列。只需使用索引数字即可抓取任意一行:
two_d_arr[0]#Thisgrabsrow0ofthearray([10,20,30])two_d_arr[:2]#Thisgrabseverythingbeforerow2([[10,20,30],[40,50,60]])
还可以使用、
、、和==运算符对数组执行条件选择和逻辑选择,从而对比数组中的值和给定值:
new_arr=np.arange(5,15)new_arr10#ThisreturnsTRUEwheretheelementsaregreaterthan10[False,False,False,False,False,False,True,True,True,True]
现在我们可以输出符合上述条件的元素:
bool_arr=new_arr10new_arr[bool_arr]#Thisreturnselementsgreaterthan10[11,12,13,14]new_arr[new_arr10]#Ashorterwaytodowhatwehavejustdone
组合使用条件运算符和逻辑运算符,我们可以得到值大于6小于10的元素:
new_arr[(new_arr6)(new_arr10)]
预期结果为:([7,8,9])
广播机制
广播机制是一种快速改变NumPy数组中的值的方式。
my_array[0:3]=50#Resultis:[50,50,50,3,4,5,6,7,8,9,10]
在这个例子中,我们将索引为0到3的元素的初始值改为50。
对NumPy数组执行数学运算
arr=np.arange(1,11)arr*arr#Multiplieseachelementbyitselfarr-arr#Subtractseachelementfromitselfarr+arr#Addseachelementtoitselfarr/arr#Divideseachelementbyitself
我们还可以对数组执行标量运算,NumPy通过广播机制使其成为可能:
arr+50#Thisadds50toeveryelementinthatarray
NumPy还允许在数组上执行通用函数,如平方根函数、指数函数和三角函数等。
np.sqrt(arr)#Returnsthesquarerootofeachelementnp.exp(arr)#Returnstheexponentialsofeachelementnp.sin(arr)#Returnsthesinofeachelementnp.cos(arr)#Returnsthecosineofeachelementnp.log(arr)#Returnsthelogarithmofeachelementnp.sum(arr)#Returnsthesumtotalofelementsinthearraynp.std(arr)#Returnsthestandarddeviationofinthearray
我们还可以在二维数组中抓取行或列的总和:
mat=np.arange(1,26).reshape(5,5)mat.sum()#Returnsthesumofallthevaluesinmatmat.sum(axis=0)#Returnsthesumofallthecolumnsinmatmat.sum(axis=1)#Returnsthesumofalltherowsinmat
现在,这篇NumPy教程进入了尾声!希望对大家有所帮助。