type
status
date
slug
summary
tags
category
icon
password
😀
本文主要记录博主自学Python-NumPy库时的笔记,主要内容是各个函数接口的含义。相关函数的测试示例代码已上传至Github
 

📝 主旨内容

NumPy(Numerical Python)是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix)),支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
NumPy是一个用python实现的科学计算库,包括:1、一个强大的N维数组对象Array;2、比较成熟的(广播)函数库;3、用于整合C/C++Fortran代码的工具包;4、实用的线性代数傅里叶变换随机数生成函数。numpy和稀疏矩阵运算包scipy配合使用更加方便。
NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。多为很多大型金融公司使用,以及核心的科学计算组织如:Lawrence Livermore,NASA用其处理一些本来使用C++,Fortran或Matlab等所做的任务。
NumPy最重要的一个特点就是ndarray(N-dimensional array),即N维数组),该对象是一个快速而灵活的大数据集容器。你可以利用这种数组对整块数据执行一些数学运算,其语法跟标量元素之间的运算一样。

一、创建 ndarray

1.1 一般的创建方法。(test02.py)

np.array() np.arange() np.linspace() 创建有连续间隔的数组。 np.repeat() 来重复数组元素。 (与np.tile()区分,tile() 函数将整个数组而非数组元素水平和垂直重复指定的次数)。 np.zeros()、np.zeros_like() 创建数组,数组元素默认值是 0。zeros_linke 函数只是根据传入的 ndarray 数组的 shape 来创建所有元素为 0 的数组,并不是拷贝源数组中的数据。 np.ones()、np.ones_like() 用于创建所有元素都为 1 的数组. ones_like 用法同 zeros_like 用法。 np.empty()、np.empty_like() 创建空数组,但并不是真正意义上的空,只是数组里面的值非常小,这样做是为了便于做数学运算。 np.eye() 创建对角矩阵数组。 np.full() 创建全为某个值的数组。

1.2 随机数生成函数:(test11.py)

np.random.random() 是最常用的随机数生成函数,该函数生成的随机数随机均匀分布于[0, 1)区间。如果不提供参数,np.random.random()函数返回一个浮点型随机数。函数还可以接受一个整型或元组参数,用于指定返回的浮点型随机数数组的结构(shape) np.random.rand(d0, d1, ..dn) 创建d0-dn维度的均匀分布的随机数数组,浮点数,范围从0-1 np.random.randn(d0, d1, ,,dn) 创建d0-dn维度的标准正态分布的随机数数组,浮点数,平均数为0,标准差为1 np.random.randint(low, high, (shape)) 从给定上下限范围选取随机整数,范围是low,high,形状是shape np.random.uniform(low, high, (size)) 产生均匀分布的数组,low为起始值,high为结束值,size为形状 np.random.normal(loc, scale, (size)) 从指定正态分布中随机抽取样本,分布中心是loc(概率分布的均值),标准差是scale,形状为size (即:生成非标准正态分布随机数) np.random.seed(s) 随机数种子,s是给定的种子值。因为计算机生成的是伪随机数,所以通过设置相同的随机数种子,可以每次生成相同的随机数 np.random.RandomState(s) 随机数生成器 np.random.permutation() 如果给的是数字n,则生成指定个数(n个)随机数的数组;如果给的是数组,则打乱数组返回。 np.random.shuffle() 打乱一个序列的原有顺序

1.3 随机抽样:

随机抽样是从指定的有序列表中随机抽取指定数量的元素。 np.random.choice(a, size=None, replace=True, p=None) 参数a表示待抽样的全体样本,它值接受整数或一维的数组(列表)。参数a如果是整数,相当于将数组np.arange(a)作为全体样本。 参数size用于指定返回抽样结果数组的结构(shape)。 参数replace用于指定是否允许多次抽取同一个样本,默认为允许。 参数p是和全体样本集合等长的权重数组,用于指定对应样本被抽中的概率。

二、数组的属性 (test03.py)

ndarray.dtype 数组的数据类型 ndarray.ndim 数组的维度数,也叫秩 ndarray.shape 数组的结构,也可以理解为数组的形状 ndarray.size 数组的元素个数 ndarray.itemsize 每个元素占用内存的大小,以字节为单位 ndarray.flags 数组的内存信息 ndarray.real 数组实部 ndarray.imag 数组虚部 ndarray.data 数组在内存中实际存储区域的起始地址 ndarray.astype() 将一个数组从一个 dtype 转换成另一个 dtype

三、数组的运算

改变数组结构 (test04-2.py) ndarray.reshape() 按照指定的结构(形状)返回数组的新视图,不改变原数组 ndarray.ravel() 返回多维数组一维化的视图,不改变原数组 ndarray.transpose() 返回行变列的视图,不改变原数组 ndarray.resize() 按照指定的结构(形状)改变原数组,无返回值 numpy.roolaxis() 翻滚轴,返回新的视图,不改变原数组
注意:改变数组结构的操作通常不会改变所操作的数组本身的存储顺序,只是生成了一个新的视图。np.resize()函数是个例外,它不返回新的视图,而是真正改变了数组的存储顺序。

四、数组函数

4.1 通用数学函数:快速的元素级数组函数 (test07.py)

类别 NumPy函数 Math模块函数 功能 数学常数 np.e math.e 自然常数 数学常数 np.pi math.pi 圆周率 数学常数 np.euler_gamma 欧拉常数 数学常数 np.nan 非数字 数学常数 np.inf 无穷大 舍入函数 np.ceil() math.ceil() 进尾取整 舍入函数 np.floor() math.floor() 去尾取整 舍入函数 np.around() 四舍五入到指定精度 舍入函数 np.rint() 四舍五入到最近整数 快速转换函数 np.deg2rad()、np.radians() 度转弧度 快速转换函数 np.rad2deg()、np.degrees() math.degrees() 弧度转度 幂指数对数函数 np.hypot() math.hypot() 计算直角三角形的斜边 幂指数对数函数 np.square() 平方 幂指数对数函数 np.sqrt() math.sqrt() 开平方 幂指数对数函数 np.power() math.pow() 幂 幂指数对数函数 np.exp() math.exp() 指数 幂指数对数函数 np.log()、np.log10()、np.log2() math.log()、math.log10()、math.log2() 对数 三角函数 np.sin()/arcsin() math.sin()/asin() 正弦/反正弦 三角函数 np.cos()/arccos() math.cos()/acos() 余弦/反余弦 三角函数 np.tan()/arctan() math.tan()/atan() 正切/反正切
补充注意: 两个 np.nan 不相等,但两个 np.inf 是相等的,判断一个数组元素是否是 np.nan 或 np.inf,需要使用 np.isnan() 和 np.isinf() 这两个相应的函数,而不是使用两个等号的逻辑表达式。

4.2 统计函数:

类别 函数 功能 查找特殊值 np.max/min(a,axis=None) 返回最大值/最小值 查找特殊值 np.nanmax/nanmin(a, axis=None) 忽略nan返回最大值/最小值 查找特殊值 np.argmax/argmin(a, axis=None) 返回最大值/最小值的索引号 查找特殊值 np.nanargmax/nanargmin(a, axis=None) 忽略nan返回最大值/最小值索引号 查找特殊值 np.median(a, axis=None) 返回中位数 查找特殊值 np.nanmedian(a, axis=None) 忽略nan返回中位数 求和差积 np.ptp(a, axis=None) 返回元素最大值与最小值的差 求和差积 np.sum(a, axis=None) 按指定轴求和 求和差积 np.nansum(a, axis=None) 忽略nan按指定轴求和 求和差积 np.cumsum(a, axis=None) 按指定轴求元素累计和 求和差积 np.nancumsum(a, axis=None) 忽略nan按指定轴求累计和 求和差积 np.diff(a, axis=None) 按指定轴返回相邻元素的差 求和差积 np.prod(a, axis=None) 按指定轴求积 求和差积 np.nanprod(a, axis=None) 忽略nan按指定轴返回算数平均值 均值和方差 np.mean(a, axis=None) 按指定轴返回算数平均值 均值和方差 np.nanmean(a, axis=None) 忽略nan按指定轴返回算数平均值 均值和方差 np.average() 返回所有元素的加权平均值 均值和方差 np.var(a) 返回数组方差 均值和方差 np.nanvar(a) 忽略nan返回数组方差 均值和方差 np.std() 返回数组标准差 均值和方差 np.nanstd() 忽略nan返回数组标准差 相关系数 np.corrcoef(a, b) 返回a和b的皮尔逊关系数
补充: (1) all 和 any 函数:判断两个数组元素是否相等。使用举例:(test08.py) print((ndarray1 == ndarray2).all()) print((ndarray1 == ndarray3).any())
(2) np.nonzero() 非零元素查找 (test14.py) (3) np.where() 条件查找函数 (test14.py)

4.3 添加(合并)、拆分和删除函数:(test09.py)

np.append() 该函数的功能不再是追加元素,而是合并数组。 np.hstack() 水平合并函数 np.vstack() 垂直合并函数 np.dstack() 深度合并函数: np.stack() 使用 axis 轴参数指定合并的规则 np.concatenate() 合并两个数组元素 np.hsplit() 水平方向拆分成2部分 np.vsplit() 垂直方向拆分成2部分 np.dsplit() 深度方向拆分成2部分 np.delete() 删除一行或者一列数组元素 np.insert() 插入元素

4.4 唯一化和集合函数:(test10.py)

Numpy提供了一些针对一维 ndarray 的基本集合运算。 np.unique() 最常用的函数,它用于找出数组中的唯一值并返回已排序的结果。 np.intersect1d() 计算两个数组交集 np.union1d() 计算两个数组并集 np.in1d() 数组中的元素是否在另一个数组中存在 np.setdiff1d() 计算两个数组的差集

4.5 数组排序函数:(test12.py)

ndarray.sort() 按从小到大进行排序 np.argsort() 很重要的函数,返回的是数组值从小到大对应的索引值

4.6 复制函数:(test12.py)

改变数组结构返回的是原数组的一个新视图,而不是原数组的副本。浅复制(view)和深复制(copy)则是创建原数组的副本,但二者之间也有细微差别:浅复制(view)是共享内存,深复制(copy)是独享内存。 ndarray.view() 浅复制 ndarray.copy() 深复制

4.7 插值函数:

数据插值是数据处理过程中经常用到的技术,常用的插值有一维插值、二维插值、高阶插值等,常见的算法有线性插值、B样条插值、临近插值等。 不过,Numpy只提供了一个简单地一维线性插值函数np.interp(),其他更加复杂的插值功能放到了Scipy中。

4.8 多项式拟合函数:

拟合又称回归,是指已知某函数的若干离散函数值,通过调整该函数中特定若干待定系数,使得该函数与已知离散函数值的误差达到最小。

4.9 数组I/O:(test15.py)

数据文件格式 存储数据格式 读写函数 CSV 通用格式 np.loadtxt()、np.savetxt() NPY/NPZ 单个数组/多个数组 np.load()、np.save()、np.savez()

4.10 自定义广播函数:(test16.py)

(10-1)使用 np.frompyfunc() 定义广播函数: 使用 np.frompyfunc() 将数值函数转换成数组函数需要提供三个参数:数值函数、输入函数的个数和返回值的个数。 另外,np.frompyfunc() 返回的广播函数,其返回值是 object 类型,最终需要根据实际情况显式地转换数据类型。
(10-2)使用 np.vectorize() 定义广播函数: np.frompyfunc() 适用于多个返回值的函数。 如果返回值只有一个,使用 np.vectorize() 定义广播函数更方便,并且还可以通过 otypes 参数指定返回数组的元素类型。
注意:自定义广播函数并不是真正的广播函数,其运行效率和循环遍历几乎没有差别,因此除非确实必要,否则不应该滥用自定义广播函数。

4.11 掩码数组:(test17.py)

————介绍: numpy.ma子模块通过引入掩码数组提供了一种解决数据缺失或无效问题的安全、便捷的方法。numpy.ma子模块的主体是MaskedArray类,他是numpy.ndarray的派生类,可以把numpy.ma子模块当做ndarray来用,且无须考虑数组的无效值是否会给操作带来无法预制的意外。
————头文件导入方式: import numpy as np import numpy.ma as ma
(11-1)创建掩码数组: 创建方式 函数 功能 由列表生成掩码数组 ma.array() 该函数和Numpy的np.array()函数类似,可以直接将列表生成掩码数组,默认mask参数为False,生成的数组类型是MaskedArray类。数组掩码梳理后,无论是查找最大值、最小值,还是计算均值、方差,都不用再担心数据是否无效的问题了。 由数组生成掩码数组 ma.asarray() 函数可以将普通的NumPy数组转成掩码数组。新生成的掩码数组不会对原数组中的np.nan或np.inf做掩码处理,但是会相应调整填充值(fill_value)
(11-2)掩码处理: (1)对数组中的无效值做掩码处理:ma.masked_invalid() 由于ma.asarray()函数不会对原数组中的np.nan或np.inf做掩码处理,而ma.masked_invalid()函数则可以实现这个功能。
(2)对数组中的给定值做掩码处理:ma.masked_equal() 有时需要将数组中的某个给定值设置为无效(掩码),ma.masked_equal()函数可以实现这个功能。
(3)对数组中符合条件的特定值做掩码处理:见下面补充(11-2-3-a) 有时需要将数组中符合条件的某些特定值设置为无效(掩码),掩码数组子模块提供了若干函数实现条件掩码。 这些可能的筛选条件包括大于、大于等于、小于、小于等于、区间内、区间外等6中。
(4)用一个数组的条件筛选结果对另一个数组做掩码处理:ma.masked_where() a和b是两个结构相同的数组,如果用a>5的条件对数组b掩码,上面那些函数就失效了。 这种情况可以使用ma.masked_where()函数,该函数也可以对数组自身掩码。
补充(11-2-3-a): ma.masked_greater(a, 4) # 掩码大于4的元素 ma.masked_greater_equal(a, 4) # 掩码大于等于4的元素 ma.masked_less(a, 4) # 掩码小于4的元素 ma.masked_less_equal(a, 4) # 掩码小于等于4的元素 ma.masked_inside(a, 2, 5) # 掩码 [2,5]之间的元素 ma.masked_outside(a, 2, 5) # 掩码 [2,5]之外的元素
(11-3)函数应用: 掩码数组内置方法的使用和普通数组没有区别。使用NumPy命名空间的函数则要慎重,如果掩码数组子模块有对应函数,应优先使用数组子模块的对应函数。 例如,对掩码数组求正弦,如果使用 np.sin() 函数,会发出警告信息;如果使用 ma.sin() 函数,则无任何问题。
(11-4)掩码数组转为普通数组: 任何情况下,我们都可以通过掩码数组的 data 属性来获得掩码数组的数据视图,其类型就是 np.ndarray 数组。 另外,还可以使用掩码数组的 array() 函数(maskedArray.array()) 或 ma.getdata() 函数来获取掩码数组的数据视图。 上述三种方法获得数据视图的操作,本质上都是操作掩码的数组本身。如果需要数据视图副本,需使用 copy() 函数。
(11-5)修改掩码: (1)通过掩码数组的 mask 属性(maskedArray.mask) 可以查看当前数组的掩码情况。 通常,数组的掩码是一个布尔型数组,或是一个布尔值。
(2)如果要对数组切片掩码或对数组的某个元素掩码,直接令该切片或该元素等于 ma.masked 常量即可。
(3)如果要撤销对数组切片或数组中的某个元素的掩码,只需要对该切片或该元素做赋值操作即可。

五、矩阵对象

————介绍: 在数学上,矩阵(Matrix)是一个按照矩形阵列排列的负数或实数集合,但在NumPy中,矩阵np.matrix是数组np.ndarray的派生类。这意味着矩阵本质上是一个数组,拥有数组的所有属性和方法;同时,矩阵又有一些不同于数组的特性和方法。 首先,矩阵是二维的,不能像数组一样幻化成任意维度,即使展开或切片,返回也是二维的;其次,矩阵和矩阵、矩阵和数组都可以做加减乘除运算,运算结果都是返回矩阵;最后,矩阵的乘法不同于数组乘法。
————头文件导入方式: import numpy as np import numpy.matlib as mat

5.1 创建矩阵:

np.mat() 该函数用于创建矩阵,它可以接受列表、数组甚至是字符串等形式的参数,还可以使用dtype参数指定数据类型。
此外,和生成特殊值数组类似,numpy.matlib子模块也提供了多个函数用于生成特殊值矩阵和随机数矩阵: mat.zeros() 全0矩阵 mat.ones() 全1矩阵 mat.eye() 单位矩阵 mat.empty() 空矩阵 mat..rand() [0, 1) 区间随机数矩阵 mat..randn() 均值为0,方差为1的正态分布矩阵

5.2 矩阵特有属性:

matlib.T 返回自身的转置矩阵 matlib.H 返回自身的共轭转置矩阵 matlib.I 返回自身的逆矩阵 matlib.A 返回自身数据的视图(ndarray 类)

5.3 矩阵乘法:

矩阵运算和数组运算大致相同,只有乘法运算有较大差别。两个数组相乘就是对应元素相乘,条件是两个数组的结构相同。事实上,及时两个数组的结构不同,只要满足特定条件,也能做乘法运算。 matlib1 * matlib2 两矩阵直接相乘 np.dot() 属于数组而言,使用星号相乘和使用 np.dot() 函数相乘是完全不同的两种乘法。对于矩阵来说,不管是使用星号相乘还是使用 np.dot() 函数相乘,结果都是 np.dot() 函数相乘的结果,因为矩阵没有对应元素相乘这个概念。np.dot() 函数实现的乘法就是矩阵乘法。

🤗 总结归纳

本文记录了博主关于Python-NumPy的学习笔记,示例代码可在本人Github上查看。如果仍有不同的地方,欢迎在评论区提问。或者,你也可以参考下面的引用文章。博主是参考如下两篇教程进行学习的。

📎 参考文章

  • 引用文章
💡
有关Python-NumPy学习上的问题,欢迎您在底部评论区留言,一起交流~
双系统Ubuntu开机wifi图标消失问题Python-Matplotlib学习笔记1——常见统计图的绘制
  • Giscus
  • Cusdis
  • Utterance
Naipings
Naipings
一个普通的大学生,分享自己学习的“有趣”知识
Announcement
type
status
date
slug
summary
tags
category
icon
password
🎉 感谢您的支持 🎉
-- 点击收藏不迷路 ---
👏欢迎更新体验👏