留学网站建设,网络公司的推广,注册公司具体费用,wordpress文章分享插件(给Python开发者加星标#xff0c;提升Python技能)作者#xff1a;牧马人 (本文来自作者投稿)0. 前言大约七八年前#xff0c;我曾经用 pyOpenGL 画过地球磁层顶的三维模型#xff0c;这段代码至今仍然还运行在某科研机构里。在那之前#xff0c;我一直觉得自己是一个合(y… (给Python开发者加星标提升Python技能)作者牧马人 (本文来自作者投稿)0. 前言大约七八年前我曾经用 pyOpenGL 画过地球磁层顶的三维模型这段代码至今仍然还运行在某科研机构里。在那之前我一直觉得自己是一个合(you)格(xiu)的 python 程序员似乎无所不能。但磁层顶模型的显示效果令我沮丧——尽管这个模型只有十几万个顶点拖拽、缩放却非常卡顿。最终我把顶点数量删减到两万左右以兼顾模型质量和响应速度才勉强交付了这个任务。从此我开始怀疑 python 的性能甚至一度怀疑 python 是否还是我的首选工具。幸运的是后来我遇到了 numpy 这个神器。numpy 是 python 科学计算的基础软件包提供多了维数组对象多种派生对象(掩码数组、矩阵等)以及用于快速操作数组的函数及 API它包括数学、逻辑、数组形状变换、排序、选择、I/O 、离散傅立叶变换、基本线性代数、基本统计运算、随机模拟等等。了解 numpy之后我才想明白当初磁层顶的三维模型之所以慢是因为使用了 list(python 数组)而不是 ndarray(numpy 数组)存储数据。有了 numpypython 程序员才有可能写出媲美 C 语言运行速度的代码。熟悉 numpy才能学会使用 pyOpenGL / pyOpenCV / pandas / matplotlib 等数据处理及可视化的模块。事实上numpy 的数据组织结构尤其是数组(numpy.ndarray)几乎已经成为所有数据处理与可视化模块的标准数据结构了(这一点类似于在机器学习领域 python 几乎已经成为首选工具语言)。越来越多的基于 python 的科学和数学软件包使用 numpy 数组虽然这些工具通常都支持 python 的原生数组作为参数但它们在处理之前会还是会将输入的数组转换为 numpy 的数组而且也通常输出为 numpy 数组。在 python 的圈子里numpy 的重要性和普遍性日趋增强。换句话说为了高效地使用当今科学/数学基于 python 的工具(大部分的科学计算工具)你只知道如何使用 python 的原生数组类型是不够的还需要知道如何使用 numpy 数组。总结在这个 AI 和 ML 霸屏的时代如果不懂 numpy请别说自己是 python 程序员。1. list VS ndarraynumpy 的核心是 ndarray 对象(numpy 数组)它封装了 python 原生的同数据类型的 n 维数组(python 数组)。numpy 数组和 python 数组之间有几个重要的区别numpy 数组一旦创建其元素数量就不能再改变了。 增删 ndarray 元素的操作意味着创建一个新数组并删除原来的数组。python 数组的元素则可以动态增减不同numpy 数组中的元素都需要具有相同的数据类型因此在内存中的大小相同。 python 数组则无此要求。numpy 数组的方法涵盖了大量数学运算和复杂操作许多方法在最外层的 numpy 命名空间中都有对应的映射函数。和 python 数组相比numpy 数组的方法功能更强大执行效率更高代码更简洁。然而以上的差异并没有真正体现出 ndarray 的优势之所在ndarray 的精髓在于 numpy 的两大特征矢量化(vectorization)和广播(broadcast)。矢量化可以理解为代码中没有显式的循环、索引等广播可以理解为隐式地对每个元素实施操作。矢量化和广播理解起来有点抽象我们还是举个栗子来说明一下吧。**例题 ** a 和 b 是等长的两个整数数组求 a 和 b 对应元素之积组成的数组。1.用 python 数组实现 c list()for i in range(len(a)): c.append(a[i]*b[i])用 numpy 数组实现c a*b这个栗子是不是体现了矢量化和广播的强大力量呢请仔细体会总结矢量化代码更简洁更易于阅读更少的代码行通常意味着更少的错误代码更接近于标准的数学符号矢量化代码更 pythonic2. dtype AND shape子曰找对象先了解品行学对象先了解属性。 ndarray 对象有很多属性详见下表。属性 说明ndarray.dtype 元素类型ndarray.shape 数组的结构ndarray.ndim 秩即轴的数量或维度的数量ndarray.size 数组元素的个数ndarray.itemsize 每个元素的大小以字节为单位ndarray.flags 数组的内存信息ndarray.real 元素的实部ndarray.imag 元素的虚部ndarray.data 数组元素的实际存储区基于以下三个原因我认为dtype 和 shape 是 ndarray 最重要的两个属性重要到几乎可以忽略其他的属性。我们趟过的坑几乎都是 dtype 挖的我们的迷茫几乎都是因为 shape 和我们期望的不一样我们的工作很多都是在改变 shapendarray.astype() 可以修改元素类型 ndarray.reshape() 可以重新定义数组的结构这两个方法的重要性和其对应的属性一样。记住这两个属性和对应的两个方法就算是登堂入室了。想了解 numpy 支持的元素类型请点击《数学建模三剑客MSN》3. 创建数组(1) 创建简单数组numpy.array(object, dtypeNone, copyTrue, orderNone, subokFalse, ndmin0)numpy.empty(shape, dtypefloat, orderC)numpy.zeros(shape, dtypefloat, orderC)numpy.ones(shape, dtypefloat, orderC)numpy.eye(N, MNone, k0, dtypefloat, orderC)应用示例 import numpy as np np.array([1, 2, 3])array([1, 2, 3]) np.empty((2, 3))array([[2.12199579e-314, 6.36598737e-314, 1.06099790e-313], [1.48539705e-313, 1.90979621e-313, 2.33419537e-313]]) np.zeros(2)array([0., 0.]) np.ones(2)array([1., 1.]) np.eye(3)array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]])(2) 创建随机数组numpy.random.random(sizeNone)numpy.random.randint(low, highNone, sizeNone, dtypel)应用示例 np.random.random(3)array([0.29334156, 0.45858765, 0.99297047]) np.random.randint(2, size10)array([1, 0, 0, 0, 1, 1, 0, 0, 1, 0]) np.random.randint(5, size(2, 4))array([[4, 0, 2, 1], [3, 2, 2, 0]]) np.random.randint(3,10,(2,4))array([[4, 8, 9, 6], [7, 7, 7, 9]])(3) 在数值范围内创建数组numpy.arange(start, stop, step, dtypeNone)numpy.linspace(start, stop, num50, endpointTrue, retstepFalse, dtypeNone)numpy.logspace(start, stop, num50, endpointTrue, base10.0, dtypeNone)应用示例 np.arange(5)array([0, 1, 2, 3, 4]) np.arange(0,5,2)array([0, 2, 4]) np.linspace(0, 5, 5)array([0. , 1.25, 2.5 , 3.75, 5. ]) np.linspace(0, 5, 5, endpointFalse)array([0., 1., 2., 3., 4.]) np.logspace(1,3,3)array([ 10., 100., 1000.]) np.logspace(1, 3, 3, endpointFalse)array([ 10. , 46.41588834, 215.443469 ])(4) 从已有数组创建数组numpy.asarray(a, dtypeNone, orderNone)numpy.empty_like(a, dtypeNone, orderK, subokTrue)numpy.zeros_like(a, dtypeNone, orderK, subokTrue)numpy.ones_like(a, dtypeNone, orderK, subokTrue)[source]应用示例 np.asarray([1,2,3])array([1, 2, 3]) np.empty_like(np.asarray([1,2,3]))array([0, 0, 0]) np.zeros_like(np.asarray([1,2,3]))array([0, 0, 0]) np.ones_like(np.asarray([1,2,3]))array([1, 1, 1])(5) 构造复杂数组[1] 重复数组 tile a np.arange(3) aarray([0, 1, 2]) np.tile(a, 2)array([0, 1, 2, 0, 1, 2]) np.tile(a, (2,3))array([[0, 1, 2, 0, 1, 2, 0, 1, 2], [0, 1, 2, 0, 1, 2, 0, 1, 2]])[2] 重复元素 repeat a np.arange(3) aarray([0, 1, 2]) a.repeat(2)array([0, 0, 1, 1, 2, 2])[3] 一维数组网格化: meshgrid lon np.arange(30, 120, 10) lonarray([ 30, 40, 50, 60, 70, 80, 90, 100, 110]) lat np.arange(10, 50, 10) latarray([10, 20, 30, 40]) lons, lats np.meshgrid(lon, lat) lonsarray([[ 30, 40, 50, 60, 70, 80, 90, 100, 110], [ 30, 40, 50, 60, 70, 80, 90, 100, 110], [ 30, 40, 50, 60, 70, 80, 90, 100, 110], [ 30, 40, 50, 60, 70, 80, 90, 100, 110]]) latsarray([[10, 10, 10, 10, 10, 10, 10, 10, 10], [20, 20, 20, 20, 20, 20, 20, 20, 20], [30, 30, 30, 30, 30, 30, 30, 30, 30], [40, 40, 40, 40, 40, 40, 40, 40, 40]])[4] 指定范围和分割方式的网格化: mgrid lats, lons np.mgrid[10:50:10, 30:120:10] lats array([[10, 10, 10, 10, 10, 10, 10, 10, 10], [20, 20, 20, 20, 20, 20, 20, 20, 20], [30, 30, 30, 30, 30, 30, 30, 30, 30], [40, 40, 40, 40, 40, 40, 40, 40, 40]]) lonsarray([[ 30, 40, 50, 60, 70, 80, 90, 100, 110], [ 30, 40, 50, 60, 70, 80, 90, 100, 110], [ 30, 40, 50, 60, 70, 80, 90, 100, 110], [ 30, 40, 50, 60, 70, 80, 90, 100, 110]]) lats, lons np.mgrid[10:50:5j, 30:120:10j] latsarray([[10., 10., 10., 10., 10., 10., 10., 10., 10., 10.], [20., 20., 20., 20., 20., 20., 20., 20., 20., 20.], [30., 30., 30., 30., 30., 30., 30., 30., 30., 30.], [40., 40., 40., 40., 40., 40., 40., 40., 40., 40.], [50., 50., 50., 50., 50., 50., 50., 50., 50., 50.]]) lonsarray([[ 30., 40., 50., 60., 70., 80., 90., 100., 110., 120.], [ 30., 40., 50., 60., 70., 80., 90., 100., 110., 120.], [ 30., 40., 50., 60., 70., 80., 90., 100., 110., 120.], [ 30., 40., 50., 60., 70., 80., 90., 100., 110., 120.], [ 30., 40., 50., 60., 70., 80., 90., 100., 110., 120.]])上面的例子中用到了虚数。构造复数的方法如下 complex(2,5)(25j)124. 数组操作(1) 切片和索引对于一维数组的索引和切片numpy和python的list一样甚至更灵活。a np.arange(9) a[-1] # 最后一个元素8 a[2:5] # 返回第2到第5个元素array([2, 3, 4]) a[:7:3] # 返回第0到第7个元素步长为3array([0, 3, 6]) a[::-1] # 返回逆序的数组array([8, 7, 6, 5, 4, 3, 2, 1, 0])假设有一栋2层楼每层楼内的房间都是3行4列那我们可以用一个三维数组来保存每个房间的居住人数(当然也可以是房间面积等其他数值信息)。 a np.arange(24).reshape(2,3,4) # 2层3行4列 aarray([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]) a[1][2][3] # 虽然可以这样23 a[1,2,3] # 但这才是规范的用法23 a[:,0,0] # 所有楼层的第1排第1列array([ 0, 12]) a[0,:,:] # 1楼的所有房间等价与a[0]或a[0,...]array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) a[:,:,1:3] # 所有楼层所有排的第2到4列array([[[ 1, 2], [ 5, 6], [ 9, 10]], [[13, 14], [17, 18], [21, 22]]]) a[1,:,-1] # 2层每一排的最后一个房间array([15, 19, 23])提示对多维数组切片或索引得到的结果维度不是确定的。(2) 改变数组的结构numpy 数组的存储顺序和数组的维度是不相干的因此改变数组的维度是非常便捷的操作除 resize() 外这一类操作不会改变所操作的数组本身的存储顺序。 a np.array([[1,2,3],[4,5,6]]) a.shape # 查看数组维度(2, 3) a.reshape(3,2) # 返回3行2列的数组array([[1, 2], [3, 4], [5, 6]]) a.ravel() # 返回一维数组array([1, 2, 3, 4, 5, 6]) a.transpose() # 行变列(类似于矩阵转置)array([[1, 4], [2, 5], [3, 6]]) a.resize((3,2)) # 类似于reshape但会改变所操作的数组 aarray([[1, 2], [3, 4], [5, 6]])np.rollaxis() 用于改变轴的顺序返回一个新的数组。用法如下numpy.rollaxis(a, axis, start0)a: 数组axis: 要改变的轴。其他轴的相对顺序保持不变start: 要改变的轴滚动至此位置之前。默认值为0应用示例 a np.ones((3,4,5,6)) np.rollaxis(a, 3, 1).shape(3, 6, 4, 5) np.rollaxis(a, 2).shape(5, 3, 4, 6) np.rollaxis(a, 1, 4).shape(3, 5, 6, 4)(3) 数组合并[1] append对于刚刚上手 numpy 的程序员来说最大的困惑就是不能使用 append() 方法向数组内添加元素了甚至连 append() 方法都找不到了。其实numpy 仍然保留了 append() 方法只不过这个方法不再是 numpy 数组的方法而是是升级到最外层的 numpy 命名空间了并且该方法的功能不再是追加元素而是合并数组了。 np.append([1, 2, 3], [[4, 5, 6], [7, 8, 9]])array([1, 2, 3, 4, 5, 6, 7, 8, 9]) np.append([[1, 2, 3]], [[4, 5, 6]], axis0)array([[1, 2, 3], [4, 5, 6]]) np.append(np.array([[1, 2, 3]]), np.array([[4, 5, 6]]), axis1)array([[1, 2, 3, 4, 5, 6]])[2] concatenateconcatenate() 和 append() 的用法非常类似不过是把两个合并对象写成了一个元组 。 a np.array([[1, 2], [3, 4]]) b np.array([[5, 6]]) np.concatenate((a, b), axis0)array([[1, 2], [3, 4], [5, 6]]) np.concatenate((a, b.T), axis1)array([[1, 2, 5], [3, 4, 6]]) np.concatenate((a, b), axisNone)array([1, 2, 3, 4, 5, 6])[3] stack除了 append() 和 concatenate() 数组合并还有更直接的水平合并(hstack)、垂直合并(vstack)、深度合并(dstack)等方式。假如你比我还懒那就只用 stack 吧足够了。 a np.arange(9).reshape(3,3) b np.arange(9,18).reshape(3,3) aarray([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) barray([[ 9, 10, 11], [12, 13, 14], [15, 16, 17]]) np.hstack((a,b)) # 水平合并array([[ 0, 1, 2, 9, 10, 11], [ 3, 4, 5, 12, 13, 14], [ 6, 7, 8, 15, 16, 17]]) np.vstack((a,b)) # 垂直合并array([[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8], [ 9, 10, 11], [12, 13, 14], [15, 16, 17]]) np.dstack((a,b)) # 深度合并array([[[ 0, 9], [ 1, 10], [ 2, 11]], [[ 3, 12], [ 4, 13], [ 5, 14]], [[ 6, 15], [ 7, 16], [ 8, 17]]])(4) 数组拆分拆分是合并的逆过程概念是一样的但稍微有一点不同 a np.arange(4).reshape(2,2) aarray([[0, 1], [2, 3]]) x, y np.hsplit(a, 2) # 水平拆分返回list xarray([[0], [2]]) yarray([[1], [3]]) x, y np.vsplit(a, 2) # 垂直拆分返回list xarray([[0, 1]]) yarray([[2, 3]]) a np.arange(8).reshape(2,2,2) aarray([[[0, 1], [2, 3]], [[4, 5], [6, 7]]]) x,y np.dsplit(a, 2) # 深度拆分返回list xarray([[[0], [2]], [[4], [6]]]) yarray([[[1], [3]], [[5], [7]]])(5) 数组排序排序不是 numpy 数组的强项但 python 数组的排序速度依然只能望其项背。[1] numpy.sort()numpy.sort() 函数返回输入数组的排序副本。numpy.sort(a, axis-1, kindquicksort, orderNone)a: 要排序的数组axis: 沿着它排序数组的轴如果没有数组会被展开沿着最后的轴排序kind: 排序方法默认为’quicksort’(快速排序)其他选项还有 ‘mergesort’(归并排序)和 ‘heapsort’(堆排序)order: 如果数组包含字段则是要排序的字段应用示例 a np.array([3, 1, 2]) np.sort(a)array([1, 2, 3]) dt np.dtype([(name, S10),(age, int)]) a np.array([(raju,21),(anil,25),(ravi, 17), (amar,27)], dtype dt) aarray([(braju, 21), (banil, 25), (bravi, 17), (bamar, 27)], dtype[(name, S10), (age, )]) np.sort(a, ordername)array([(bamar, 27), (banil, 25), (braju, 21), (bravi, 17)], dtype[(name, S10), (age, )])[2] numpy.argsort()函数返回的是数组值从小到大的索引值。numpy.argsort(a, axis-1, kindquicksort, orderNone)a: 要排序的数组axis: 沿着它排序数组的轴如果没有数组会被展开沿着最后的轴排序kind: 排序方法默认为’quicksort’(快速排序)其他选项还有 ‘mergesort’(归并排序)和 ‘heapsort’(堆排序)order: 如果数组包含字段则是要排序的字段应用示例 a np.array([3, 1, 2]) np.argsort(a)array([1, 2, 0], dtypeint64)(6) 查找和筛选[1] 返回数组中最大值和最小值的索引numpy.argmax(a, axisNone, outNone)numpy.argmin(a, axisNone, outNone)[2] 返回数组中非零元素的索引numpy.nonzero(a)[3] 返回数组中满足给定条件的元素的索引numpy.where(condition[, x, y])应用示例 a np.arange(10) aarray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) np.where(a 5)(array([0, 1, 2, 3, 4], dtypeint64),) a a.reshape((2, -1)) aarray([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]) np.where(a 5)(array([0, 0, 0, 0, 0], dtypeint64), array([0, 1, 2, 3, 4], dtypeint64)) np.where(a 5, a, array([[ 0, 1, 2, 3, 4], [50, 60, 70, 80, 90]])[4] 返回数组中被同结构布尔数组选中的各元素numpy.extract(condition, arr)应用示例 a np.arange(12).reshape((3, 4)) aarray([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) condition np.mod(a, 3)0 conditionarray([[ True, False, False, True], [False, False, True, False], [False, True, False, False]]) np.extract(condition, a)array([0, 3, 6, 9])(7) 增减元素[1] 在给定索引之前沿给定轴在输入数组中插入值并返回新的数组numpy.insert(arr, obj, values, axisNone)应用示例 a np.array([[1, 1], [2, 2], [3, 3]]) aarray([[1, 1], [2, 2], [3, 3]]) np.insert(a, 1, 5)array([1, 5, 1, 2, 2, 3, 3]) np.insert(a, 1, 5, axis0)array([[1, 1], [5, 5], [2, 2], [3, 3]]) np.insert(a, 1, [5,7], axis0)array([[1, 1], [5, 7], [2, 2], [3, 3]]) np.insert(a, 1, 5, axis1)array([[1, 5, 1], [2, 5, 2], [3, 5, 3]])[2] 在给定索引之前沿给定轴删除指定子数组并返回新的数组numpy.delete(arr, obj, axisNone)应用示例 a np.array([[1, 2], [3, 4], [5, 6]]) aarray([[1, 2], [3, 4], [5, 6]]) np.delete(a, 1)array([1, 3, 4, 5, 6]) np.delete(a, 1, axis0)array([[1, 2], [5, 6]]) np.delete(a, 1, axis1)array([[1], [3], [5]])[3] 去除重复元素numpy.unique(ar, return_indexFalse, return_inverseFalse, return_countsFalse, axisNone)arr输入数组如果不是一维数组则会展开return_index如果为true返回新列表元素在旧列表中的位置(下标)并以列表形式储return_inverse如果为true返回旧列表元素在新列表中的位置(下标)并以列表形式储return_counts如果为true返回去重数组中的元素在原数组中的出现次数应用示例 a np.array([[1, 0, 0], [1, 0, 0], [2, 3, 4]]) np.unique(a)array([0, 1, 2, 3, 4]) np.unique(a, axis0)array([[1, 0, 0], [2, 3, 4]]) u, indices np.unique(a, return_indexTrue) uarray([0, 1, 2, 3, 4]) indicesarray([1, 0, 6, 7, 8], dtypeint64) u, indices np.unique(a, return_inverseTrue) uarray([0, 1, 2, 3, 4]) indicesarray([1, 0, 0, 1, 0, 0, 2, 3, 4], dtypeint64) u, num np.unique(a, return_countsTrue) uarray([0, 1, 2, 3, 4]) numarray([4, 2, 1, 1, 1], dtypeint64)(8) 数组IOnumpy 为 ndarray 对象引入了新的二进制文件格式用于存储重建 ndarray 所需的数据、图形、dtype 和其他信息。.npy 文件存储单个数组.npz 文件存取多个数组。[1] 保存单个数组到文件numpy.save(file, arr, allow_pickleTrue, fix_importsTrue)file: 要保存的文件扩展名为 .npy如果文件路径末尾没有扩展名 .npy该扩展名会被自动加上arr: 要保存的数组allow_pickle: 可选布尔值允许使用 python pickles 保存对象数组python 中的 pickle 用于在保存到磁盘文件或从磁盘文件读取之前对对象进行序列化和反序列化fix_imports: 可选为了方便 pyhton2 读取 python3 保存的数据[2] 保存多个数组到文件numpy.savze() 函数用于将多个数组写入文件默认情况下数组是以未压缩的原始二进制格式保存在扩展名为 .npz 的文件中。numpy.savez(file, *args, **kwds)file: 要保存的文件扩展名为 .npz如果文件路径末尾没有扩展名 .npz该扩展名会被自动加上args: 要保存的数组可以使用关键字参数为数组起一个名字非关键字参数传递的数组会自动起名为 arr_0, arr_1, …kwds: 要保存的数组使用关键字名称[3] 从文件加载数组numpy.load(file, mmap_modeNone, allow_pickleTrue, fix_importsTrue, encodingASCII)file: 类文件对象(支持 seek() 和 read()方法)或者要读取的文件路径arr: 打开方式None | ‘r’ | ‘r’ | ‘w’ | ‘c’allow_pickle: 可选布尔值允许使用 python pickles 保存对象数组python 中的 pickle 用于在保存到磁盘文件或从磁盘文件读取之前对对象进行序列化和反序列化fix_imports: 可选为了方便 pyhton2 读取 python3 保存的数据encoding: 编码格式‘latin1’ | ‘ASCII’ | ‘bytes’应用示例a np.array([[1,2,3],[4,5,6]])b np.arange(0, 1.0, 0.1)c np.sin(b)# c 使用了关键字参数 sin_arraynp.savez(runoob.npz, a, b, sin_array c)r np.load(runoob.npz) print(r.files) # 查看各个数组名称print(r[arr_0]) # 数组 aprint(r[arr_1]) # 数组 bprint(r[sin_array]) # 数组 c[4] 使用文本文件存取数组numpy 也支持以文本文件存取数据。savetxt() 函数是以简单的文本文件格式存储数据对应的使用 loadtxt() 函数来获取数据。应用示例a np.array([1,2,3,4,5]) np.savetxt(out.txt,a) b np.loadtxt(out.txt) print(b)5. 常用函数(1) 舍入函数[1] 四舍五入numpy.around(a, decimals0, outNone)应用示例 np.around([-0.42, -1.68, 0.37, 1.64])array([-0., -2., 0., 2.]) np.around([-0.42, -1.68, 0.37, 1.64], decimals1)array([-0.4, -1.7, 0.4, 1.6]) np.around([.5, 1.5, 2.5, 3.5, 4.5]) # rounds to nearest even valuearray([ 0., 2., 2., 4., 4.])[2] 去尾和进一numpy.floor(a)numpy.ceil(a)应用示例 np.floor([-0.42, -1.68, 0.37, 1.64])array([-1., -2., 0., 1.]) np.ceil([-0.42, -1.68, 0.37, 1.64])array([-0., -1., 1., 2.])(2) 数学函数函数 说明numpy.deg2rad() / numpy.radians() 度转弧度numpy.rad2deg() / numpy.degrees() 弧度转度numpy.sin() 正弦函数numpy.arcsin() 反正弦函数numpy.cos() 余弦函数numpy.arccos() 反余弦函数numpy.tan() 正切函数numpy.arctan() 反正切函数numpy.hypot() 计算直角三角形斜边numpy.square() 平方numpy.sqrt() 开平方numpy.power 乘方numpy.exp() 指数numpy.log() 对数numpy.log2() 对数numpy.log10() 对数(3) 统计函数函数 说明numpy.sum(a[, axis, dtype, out, keepdims]) 按指定的轴求元素之和numpy.nansum(a[, axis, dtype, out, keepdims]) 按指定的轴求元素之和numpy.nan视为0numpy.cumsum(a[, axis, dtype, out]) 按指定的轴求元素累进和numpy.prod(a[, axis, dtype, out, keepdims]) 按指定的轴求元素之积numpy.diff(a[, n, axis]) 返回相邻元素的差numpy.ptp() 返回数组中元素最大值与最小值的差numpy.var() 返回数组方差numpy.std() 返回数组标准差numpy.median() 返回数组元素的中位数numpy.mean(a, axisNone, dtypeNone, outNone, keepdims) 返回所有元素的算数平均值numpy.average() 根据权重数据返回数据数组所有元素的夹权平均值6. 牛刀小试**例题 ** vertices 是若干三维空间随机点的集合p 是三维空间的一点找出 vertices 中距离 p 点最近的一个点并计算它们的距离。用 python 数组实现import mathvertices [[3,4,5], [7,8,9], [4,9,3]] p [2,7,4]d list()for v in vertices: d.append(math.sqrt(math.pow(v[0]-p[0], 2)math.pow(v[1]-p[1], 2)math.pow(v[2]-p[2], 2)))print(vertices[d.index(min(d))], min(d))用 numpy 数组实现import numpy as npvertices np.array([[3,4,5], [7,8,9], [4,9,3]])p np.array([2,7,4])d np.sqrt(np.sum(np.square((vertices-p)), axis1))print(vertices[d.argmin()], d.min())用随机方式生成1000个点比较两种的方法的效率。【本文作者】许向武山东远思信息科技有限公司CEO网名牧码人(天元浪子)齐国土著太公之后。少小离家独闯江湖后归隐于华不注山。素以敲击键盘为业偶尔游戏于各网络对局室擅长送财送分深为众棋友所喜闻乐见。推荐阅读(点击标题可跳转阅读)写给 python 程序员的 OpenGL 教程Numpy 库准备放弃支持 Python 2觉得本文对你有帮助请分享给更多人关注「Python开发者」加星标提升Python技能好文章我在看❤️