当前位置: 首页 > 科技观察

Numpy中数组详解

时间:2023-03-12 00:24:47 科技观察

Numpy定义NumPy(NumericalPython)是Python语言的一个扩展程序库,支持大量的维数数组和矩阵运算,也为数组提供了大量的数学函数库操作。NumPy通常与SciPy(科学Python)和Matplotlib(绘图库)一起使用。这种组合被广泛用于替代MatLab。它是一个强大的科学计算环境,可以帮助我们通过Python学习数据科学或机器学习。NumPy的主要应用包括:机器学习模型:在编写机器学习算法时,需要对矩阵进行各种数值计算。比如矩阵乘法、转置、加法等。NumPy为简单(在编写代码方面)和快速(在速度方面)的计算提供了一个非常好的库。NumPy数组用于存储机器学习模型的训练数据和参数。图像处理和计算机图形学:计算机中的图像表示为多维数字数组。NumPy成为同等情况下最自然的选择。事实上,NumPy提供了一些用于快速处理图像的优秀库函数。例如,镜像图像,将图像旋转特定角度等。在涉及数学任务时,基于MATLAB的替代方案。为什么使用numpyPython提供了一个列表容器,可以作为数组使用。但是列表中的元素可以是任何对象,所以指向对象的指针保存在列表中。这样,为了保存一个简单的列表[1,2,3]。您需要三个指针和三个整数对象。对于数值运算,这种结构显然不够高效。Python虽然也提供了array模块,但是只支持一维数组,不支持多维数组(在TensorFlow中偏向于矩阵理解),也没有各种运算函数。因此,它不适合数值运算。NumPy的出现弥补了这些不足。(——来自张若宇的《Python科学计算》)详细请参考:https://numpy.org/doc/stable/index.htmlNumPy安装因为numpy一般是和scipymatplotlib一起使用,所以可以将三个模块一起安装pip3install--usernumpyscipymatplotlibnumpy数组基础使用np数组的创建importnumpyasnpa=np.array([1,2,3,4]),#1矩阵有4行,即一维数组b=np.arange(4)#1行4列的矩阵,元素递增1的一维数组c=np.array([[1,2],[3,4]])#2rows和2列矩阵,即二维数组d=np.arange(4).reshape((2,2))#变换输出2行2列print(a)print(type(a))#输出一个print(b)print(c)print(d)输出的类型分别为:[1234][0123][[12][34]][[01][23]]np数组广播广播(Broadcast)是numpy对不同形状(shape)的数组进行数值计算的方式。数组的算术运算通常在相应的元素上进行。如果a和b两个数组的shape相同,即a.shape==b.shape,那么a*b的结果就是a和b数组对应位的乘积。这需要相同数量的维度和相同长度的每个维度。比如代码a=np.array([1,2,3])b=np.array([10,20,30])c=a*bprint(c)输出[104090]数组广播加法运算a=np.array([[0,0,0],[10,10,10],[20,20,20],[30,30,30]])#4x3二维数组b=np.array([1,2,3])print(a+b)outputs[[111213][212223]]下图展示了数组b是如何广播来兼容数组a的。将一个4x3的二维数组添加到一个长度为3的一维数组中,相当于在二维中将数组b重复四次,重新操作:np数组的切片和索引ndarray的内容object可以通过索引或者切片进行修改访问,和Python中list的切片操作一样。ndarray数组可以根据0-n的下标进行索引,使用内置的slice函数并设置start、stop和step参数,可以从原数组中切出一个新的数组作为slice对象。相信大家都了解了python列表切片相关的操作,也会对这部分的内容不陌生。下面是几个经典例子:基础例子importnumpyasnpa=np.arange(10)#[0123456789]b=a[5]#subscript5个元素的值c=np.array([[1,2,3],[3,4,5],[6,7,8]])print(b)print(a[3:5])#输出下标3-5的值,注意这里可以输出下限3,不包括上限5print(c[0,0])#输出第一行第一列的元素,即1printin[1,2,3](c[...,1])#的第二列元素print(c[1,...])#第二行元素print(c[...,1:])#第二列和其余所有元素输出5[34]1[247][345][[23][45][78]]布尔索引实例我们可以通过布尔数组对目标数组进行索引。布尔索引使用布尔运算(如:比较运算符)来获取满足指定条件的元素数组。c=np.array([[1,2,3],[3,4,5],[6,7,8]])print(c[c>3])#打印大于3的元素输出[45678】numpy数组遍历直接上代码,普通一维数组arr=np.array([1,2,3])forxinarr:print(x)输出123定义了一个numpy的二维数组,上面两个数组dimensions不在这里讨论arr=np.array([[1,2,3],[4,5,6]])#traverseforxinarr:print(x)output[123][456]如果你想输出每个元素一个一个,可以写代码forxinarr:foryinx:print(y)输出123456,上面的方法比较麻烦。我们可以通过方法np.nditer一个一个的输出每个元素forxinnp.nditer(arr):print(x)output123456numpyarray元素过滤的例子,在np数组中,过滤大于2的元素arr=np.array([1,2,3,4])newarr=arr[arr>2]print(newarr)output[34]怎么样,是不是很简单!numpy数组对字符的处理np数组存储字符,如果对字符元素进行相关操作,需要用到api——np.char有这样的需求,字符'0.01%','1.1%','1.21%',去掉%,将字符转为float类型。如何实现?代码如下:b=np.array(['0.01%','1.1%','1.21%'])newb=np.char.rstrip(b,'%').astype(float)print(newb)output[0.011.11.21]其中:rstrip表示删除某个字符astype(float)表示将元素转化为float