本文讨论安装NumPy,然后创建、读取和排序NumPy数组。NumPy或NumericalPython是一个库,可以轻松地在Python中对线性序列和矩阵执行统计和设置操作。正如我在关于Python数据类型的笔记中所述,它比Python的列表快几个数量级。NumPy在数据分析和科学计算中被大量使用。我将介绍安装NumPy,然后创建、读取和排序NumPy数组。NumPy数组也称为ndarrays,N维数组的缩写。安装NumPy使用pip安装NumPy包非常简单,可以像安装任何其他包一样安装:pipinstallnumpy安装NumPy包后,只需将其导入到你的Python文件中即可:约定,但您可以使用您想要的任何其他别名来代替np。为什么要使用NumPy?因为它比Python列表快几个数量级,所以在处理大数字时,NumPy比普通Python列表快几个数量级。为了了解它到底有多快,我首先测量了普通Python列表上min()和max()操作的时间。我将首先创建一个包含999,999,999个项目的Python列表:>>>my_list=range(1,1000000000)>>>len(my_list)999999999现在我将测量时间以找到该列表中的最小值:>>>start=time.time()>>>min(my_list)1>>>print('经过的时间以毫秒为单位:'+str((time.time()-start)*1000))经过的时间以毫秒为单位:27007.00879096985这花了大约27,007毫秒,或大约27秒。这是一个很长的时间。现在我试着弄清楚什么时候找到最大值:>>>start=time.time()>>>max(my_list)999999999>>>print('Timeelapsedinmilliseconds:'+str((time.time()-start)*1000))经过的时间(以毫秒为单位):28111.071348190308这花费了大约28,111毫秒,或大约28秒。现在我尝试用NumPy找到最小和最大时间:>>>my_list=np.arange(1,1000000000)>>>len(my_list)999999999>>>start=time.time()>>>my_list.min()1>>>print('经过的时间以毫秒为单位:'+str((time.time()-start)*1000))经过的时间以毫秒为单位:1151.1778831481934>>>>>>start=time.time()>>>my_list.max()999999999>>>print('耗时毫秒:'+str((time.time()-start)*1000))耗时毫秒:1114.8970127105713耗时约1151毫秒,发现最大值为1114毫秒。这大约是1秒。如您所见,使用NumPy将查找大约10亿个值的列表的最小值和最大值的时间从大约28秒减少到1秒。这就是NumPy的强大之处。从Python列表创建ndarrays在NumPy中有几种创建ndarrays的方法。您可以使用元素列表创建一个ndarray:>>>my_ndarray=np.array([1,2,3,4,5])>>>print(my_ndarray)[12345]与上面ndarray定义,我会检查几件事。首先,上面定义的变量类型是numpy.ndarray。这是所有NumPyndarray的类型:>>>type(my_ndarray)这里要注意的另一件事是“形状”。ndarray的形状是ndarray的每个维度的长度。可以看到,my_ndarray的形状是(5,)。这意味着my_ndarray包含一个包含5个元素的维度(轴)。>>>np.shape(my_ndarray)(5,)数组中的维数称为它的“秩”。所以上面的ndarray的秩为1。我再定义一个ndarraymy_ndarray2作为多维ndarray。那么它的形状会是怎样的呢?请看下面:>>>my_ndarray2=np.array([(1,2,3),(4,5,6)])>>>np.shape(my_ndarray2)(2,3)这是一个rankndarrayof2.另一个要检查的属性是dtype,它是数据类型。检查我们的ndarray的dtype产生以下结果:>>>my_ndarray.dtypedtype('int64')int64意味着我们的ndarray由64位整数组成。NumPy无法创建混合类型的ndarray,它必须只包含一种类型的元素。如果你定义了一个包含混合元素类型的ndarray,NumPy会自动将所有元素类型转换为可以包含所有元素的最高元素类型。例如,创建一个整数和浮点数的混合序列将创建一个float64ndarray:>>>my_ndarray2=np.array([1,2.0,3])>>>print(my_ndarray2)[1.2.3.]>>>my_ndarray2.dtypedtype('float64')此外,将其中一个元素设置为字符串将创建一个dtype等于>>my_ndarray2=np.array([1,'2',3])>>>print(my_ndarray2)['1''2''3']>>>my_ndarray2.dtypedtype('>>my_ndarray=np.array([1,2,3,4,5])>>>my_ndarray.size5使用NumPy方法创建ndarrays如果你不想直接使用列表来创建ndarrays,还有其他几种方法可用于创建其NumPy方法。您可以使用np.zeros()创建一个用零填充的ndarray。它以“形状”作为参数,这是一个包含行数和列数的列表。它还可以接受一个可选的dtype参数,即ndarray的数据类型:>>>my_ndarray=np.zeros([2,3],dtype=int)>>>print(my_ndarray)[[000][000]]你可以使用np.ones()创建一个用1填充的ndarray:>>>my_ndarray=np.ones([2,3],dtype=int)>>>print(my_ndarray)[[111][111]]您可以使用np.full()为ndarray填充特定值:>>>my_ndarray=np.full([2,3],10,dtype=int)>>>print(my_ndarray)[[101010][101010]]您可以使用np.eye()创建一个单位矩阵/ndarray,它是一个主对角线上全为1的方阵。方阵是行数和列数相同的矩阵:>>>my_ndarray=np.eye(3,dtype=int)>>>print(my_ndarray)[[100][010][001]]您可以使用np.diag()创建一个矩阵,其中沿对角线具有指定值,矩阵的其余部分为0:>>>my_ndarray=np.diag([10,20,30,40,50])>>>print(my_ndarray)[[100000][020000][003000][000400][000050]]您可以使用np.range()创建具有特定值范围的ndarray。它是通过指定整数开始和结束(不包括)范围和步长来创建的:>>>my_ndarray=np.arange(1,20,3)>>>print(my_ndarray)[14710131619]读取ndarray可以使用索引、切片或布尔索引来读取ndarray值。使用索引读取ndarray值在索引中,您可以使用ndarray元素的整数索引来读取值,就像读取Python列表一样。就像Python列表一样,索引从0开始。例如,在如下定义的ndarray中:>>>my_ndarray=np.arange(1,20,3)第四个值将是my_ndarray[3],即10。最后一个值是my_ndarray[-1],即19:>>>my_ndarray=np.arange(1,20,3)>>>print(my_ndarray[0])1>>>print(my_ndarray[3])10>>>print(my_ndarray[-1])19>>>print(my_ndarray[5])16>>>print(my_ndarray[6])19使用切片读取ndarray您也可以使用块切片读取ndarray。分片通过使用冒号(:)运算符指定起始索引和结束索引来工作。然后Python将获取开始和结束索引之间的ndarray切片:>>>print(my_ndarray[:])[14710131619]>>>print(my_ndarray[2:4])[710]>>>打印(my_ndarray[5:6])[16]>>>打印(my_ndarray[6:7])[19]>>>打印(my_ndarray[:-1])[147101316]>>>print(my_ndarray[-1:])[19]切片创建对ndarray的引用(或视图)。这意味着修改切片中的值也会改变原始ndarray中的值。例如:>>>my_ndarray[-1:]=100>>>print(my_ndarray)[147101316100]对于rank大于1的ndarray分片,可以使用[linestartindex:lineendindex,columnstartindex:columnendindex]语法:>>>my_ndarray2=np.array([(1,2,3),(4,5,6)])>>>print(my_ndarray2)[[123][456]]>>>print(my_ndarray2[0:2,1:3])[[23][56]]使用布尔索引读取ndarray的方法另一种读取ndarray的方法是使用布尔值索引。在此方法中,您在方括号内指定过滤条件,然后返回与该条件匹配的ndarray的一部分。例如,要获取一个ndarray中所有大于5的值,可以指定布尔索引操作my_ndarray[my_ndarray>5]。这个操作会返回一个包含所有大于5的值的ndarray:>>>my_ndarray=np.array([1,2,3,4,5,6,7,8,9,10])>>>my_ndarray2=my_ndarray[my_ndarray>5]>>>print(my_ndarray2)[678910]例如要获取一个ndarray中的所有偶数值,可以使用布尔索引如下:>>>my_ndarray2=my_ndarray[my_ndarray%2==0]>>>print(my_ndarray2)[246810]要获取所有奇数值,您可以使用此方法:>>>my_ndarray2=my_ndarray[my_ndarray%2==1]>>>print(my_ndarray2)[13579]ndarrays上的向量和标量算术NumPy的ndarrays允许向量和标量算术运算。在向量运算中,在两个ndarray之间执行逐元素算术运算。在标量算术中,算术运算在ndarray和常量标量值之间执行。两个ndarrays如下:>>>my_ndarray=np.array([1,2,3,4,5])>>>my_ndarray2=np.array([6,7,8,9,10])如果你添加上述两个ndarrays将产生一个新的ndarray,其中添加了两个ndarrays的元素。例如,生成的ndarray的第一个元素将是添加原始ndarray的第一个元素的结果,依此类推:>>>print(my_ndarray2+my_ndarray)[79111315]这里,7是1并且6的总和,这是我要添加的ndarray中的前两个元素。同样,15是5和最后一个元素10的和。考虑以下算术运算:>>>print(my_ndarray2-my_ndarray)[5555]>>>>>>print(my_ndarray2*my_ndarray)[614243650]>>>>>>print(my_ndarray2/my_ndarray)[6。3.52.666666672.252.]在将标量值附加到ndarray时具有类似的效果,标量值将添加到ndarray的所有元素。这称为“广播”:>>>print(my_ndarray+10)[1112131415]>>>>>>print(my_ndarray-10)[-9-8-7-6-5]>>>>>>print(my_ndarray*10)[1020304050]>>>>>>>>print(my_ndarray/10)[0.10.20.30.40.5]有两种方法可以对ndarray进行就地排序或排序-地方。就地排序对原始ndarray进行排序和修改,而异地排序返回排序后的ndarray,而不修改原始ndarray。我将尝试这两个示例:>>>my_ndarray=np.array([3,1,2,5,4])>>>my_ndarray.sort()>>>print(my_ndarray)[12345]如您所见,sort()方法就地对ndarray进行排序并修改原始数组。还有一个叫做np.sort()的方法,它对数组进行错位排序:>>>my_ndarray=np.array([3,1,2,5,4])>>>print(np.sort(my_ndarray))[12345]>>>print(my_ndarray)[31254]如您所见,np.sort()方法返回一个已排序的ndarray而不对其进行修改。总结我已经介绍了很多关于NumPy和ndarrays的内容。我谈到了创建ndarray、读取它们的不同方法、基本向量和标量算术以及排序。NumPy有很多值得探索的东西,包括集合操作,如union()和intersection(),统计操作,如min()和max(),等等。我希望我上面演示的示例有用。祝你探索NumPy好运。