Python常用包学习(一)NumPy包
天我们主要来学习NumPy包常用的一些操作
官网:http://www.numpy.org/
官方文档:https://docs.scipy.org/doc/numpy/user/index.html
NumPy模块基本介绍
NumPy模块是Python的一种开源的数值计算扩展,是一个用python实现的科学计算包,主要包括:
- 一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组,称为ndarray(N-dimensional array object)
- 用于对整组数据进行快速运算的标准数学函数:ufunc(universal function object)
- 实用的线性代数、傅里叶变换和随机数生成函数。
- NumPy和稀疏矩阵的运算包Scipy配合使用更加方便。
NumPy核心数据结构:ndarray
- NumPy的数组类被称作ndarray。通常被称作数组。注意numpy.array和标准Python库类array.array并不相同,后者只处理一维数组和提供少量功能。
- 一种由相同类型的元素组成的多维数组,元素数量是实现给定好的
- 元素的数据类型由dtype(data-type)对象来指定,每个ndarray只有一种dtype类型
- ndarray的大小固定,创建好数组后数组大小是不会再发生改变的
ndarray创建
普通方式创建
函数创建:
- array函数:接收一个普通的python序列,并将其转换为ndarray
- zeros函数:创建指定长度或者形状的全零数组。
- ones函数:创建指定长度或者形状的全1数组。
- empty函数:创建一个没有任何具体值的数组(准备地说是创建一些未初始化的ndarray多维数组)
- arange函数: 类似python的range函数,通过指定开始值、终值和步长来创建一个一维数组,注意:最终创建的数组不包含终值
- linspace函数:通过指定开始值、终值和元素个数来创建一个一维数组,数组的数据元素符合等差数列,可以通过endpoint关键字指定是否包含终值,默认包含终值
- logspace函数:和linspace函数类似,不过创建的是等比数列数组
- 使用随机数填充数组,即使用numpy.random中的random()函数来创建0-1之间的随机元素,数组包含的元素数量由参数决定








ndarray属性
- ndim 数组轴(维度)的个数,轴的个数被称作秩
- shape 数组的维度, 例如一个2排3列的矩阵,它的shape属性将是(2,3),这个元组的长度显然是秩,即维度或者ndim属性
- size 数组元素的总个数,等于shape属性中元组元素的乘积。
- dtype 一个用来描述数组中元素类型的对象,可以通过创造或指定dtype使用标准Python类型。不过NumPy提供它自己的数据类型。
- itemsize 数组中每个元素的字节大小。例如,一个元素类型为float64的数组itemsiz属性值为8(=64/8),又如,一个元素类型为complex32的数组item属性为4(=32/8).

NumPy基本数据类型
|
数据类型 |
类型简写 |
说明 |
|
int_ |
|
默认整形 |
|
intc |
|
等价于long的整形 |
|
int8 |
i1 |
字节整形,1个字节,范围:[-128,127] |
|
int16 |
i2 |
整形,2个字节,范围:[-32768,32767] |
|
int32 |
i3 |
整形,4个字节,范围:[-2^31, 2^31-1] |
|
int64 |
i4 |
整形,8个字节,范围:[-2^63, 2^63-1] |
|
uint8 |
u1 |
无符号整形, 1个字节, 范围:[0,255] |
|
uint16 |
u2 |
无符号整形, 2个字节, 范围:[0,65535] |
|
uint32 |
u3 |
无符号整形, 1个字节, 范围:[0, 2^32-1] |
|
uint64 |
u4 |
无符号整形, 1个字节, 范围:[0,2^64-1] |
|
bool_ |
|
以一个字节形成存储的布尔值(True或者False) |
|
数据类型 |
类型简写 |
说明 |
|
float_ |
|
float64简写形式 |
|
float16 |
f2 |
半精度浮点型(2字节):1符号位+5位指数+10位的小数部分 |
|
float32 |
f4或者f |
单精度浮点型(4字节):1符号位+8位指数+23位的小数部分 |
|
float64 |
f8或者d |
双精度浮点型(8字节):1符号位+11位指数+52位的小数部分 |
|
complex_ |
c16 |
complex128的简写形式 |
|
complex64 |
c8 |
复数,由两个32位的浮点数来表示 |
|
complex128 |
c16 |
复数,由两个64位的浮点数来表示 |
|
object |
O |
Python对象类型 |
|
String_ |
S |
固定长度的字符串类型(每个字符1个字节),比如:要创建一个长度为8的字符串,应该使用S8 |
|
Unicode_ |
U |
固定长度的unicode类型的字符串(每个字符占用字节数由平台决定),长度定义类似String_类型 |
- 创建numpy数组的时候可以通过属性dtype显示指定数据类型,如果不指定的情况下,numpy会自动推断出适合的数据类型,所以一般不需要显示给定数据类型。
- 如果需要更改一个已经存在的数组的数据类型,可以通过astype方法进行修改从而得到一个新数组。

数值型dtype的命名方式为:一个类型名称(eg:int、float等),后接一个表示各个元素位长的数字
比如Python的float数据类型(双精度浮点值),需要占用8个字节(64位),因此在NumPy中记为float64
每个数据类型都有一个类型代码,即简写方式

ndarray修改形状
- 对于一个已经存在的ndarray数组对象而言,可以通过修改形状相关的参数/方法从而改变数组的形状。
- 直接修改数组ndarray的shape值, 要求修改后乘积不变。
- 直接使用reshape函数创建一个改变尺寸的新数组,原数组的shape保持不变,但是新数组和原数组共享一个内存空间,也就是修改任何一个数组中的值都会对另外一个产生影响,另外要求新数组的元素个数和原数组一致。
- 当指定某一个轴为-1的时候,表示将根据数组元素的数量自动计算该轴的长度值。


NumPy基本操作
-
数组与标量、数组之间的运算
数组不用循环即可对每个元素执行批量的算术运算操作,这个过程叫做矢量化,即用数组表达式代替循环的做法。
矢量化数组运算性能比纯Python方式快上一两个数据级。
大小相等的两个数组之间的任何算术运算都会将其运算应用到元素级上的操作。
元素级操作:在NumPy中,大小相等的数组之间的运算,为元素级运算,即只用于位置相同的元素之间,所得的运算结果组成一个新的数组,运算结果的位置跟操作数位置相同。



-
数组的矩阵积(matrix product)
矩阵积(matrix product):两个二维矩阵(行和列的矩阵)满足第一个矩阵的列数与第二个矩阵的行数相同,那么可以进行矩阵的乘法,即矩阵积,矩阵积不是元素级的运算。也称为点积、数量积。


-
数组的索引与切片
ndarray-多维数组的索引


- 索引

- 切片



- 布尔类型索引
利用布尔类型的数组进行数据索引,最终返回的结果是对应索引数组中数据为True位置的值。


- ndarray-花式索引
花式索引(Fancy indexing)指的是利用整数数组进行索引的方式

-
数组的转置与轴对换
- 数组转置是指将shape进行重置操作,并将其值重置为原始shape元组的倒置,比如原始的shape值为:(2,3,4),那么转置后的新元组的shape的值为: (4,3,2)f
- 对于二维数组而言(矩阵)数组的转置其实就是矩阵的转置
- 可以通过调用数组的transpose函数或者T属性进行数组转置操作

-
通用函数:快速的元素级数组成函数
- ufunc:numpy模块中对ndarray中数据进行快速元素级运算的函数,也可以看做是简单的函数(接受一个或多个标量值,并产生一个或多个标量值)的矢量化包装器。
- 主要包括一元函数和二元函数
ndarray-通用函数/常用函数(一元函数)
|
一元ufunc |
描述 |
调用方式 |
|
abs, fabs |
计算整数、浮点数或者复数的绝对值,对于非复数,可以使用更快的fabs |
np.abs(arr) np.fabs(arr) |
|
sqrt |
计算各个元素的平方根,相当于arr ** 0.5, 要求arr的每个元素必须是非负数 |
np.sqrt(arr) |
|
square |
计算各个元素的评分,相当于arr ** 2 |
np.square(arr) |
|
exp |
计算各个元素的指数e的x次方 |
np.exp(arr) |
|
log、log10、log2、log1p |
分别计算自然对数、底数为10的log、底数为2的log以及log(1+x);要求arr中的每个元素必须为正数 |
np.log(arr) np.log10(arr) np.log2(arr) np.log1p(arr) |
|
sign |
计算各个元素的正负号: 1 正数,0:零,-1:负数 |
np.sign(arr) |
|
ceil |
计算各个元素的ceiling值,即大于等于该值的最小整数 |
np.ceil(arr) |
|
floor |
计算各个元素的floor值,即小于等于该值的最大整数 |
np.floor(arr) |
|
rint |
将各个元素值四舍五入到最接近的整数,保留dtype的类型 |
np.rint(arr) |

|
一元ufunc |
描述 |
调用方式 |
|
modf |
将数组中元素的小数位和整数位以两部分独立数组的形式返回 |
np.modf(arr) |
|
isnan |
返回一个表示“那些值是NaN(不是一个数字)”的布尔类型数组 |
np.isnan(arr) |
|
isfinite、isinf |
分别一个表示”那些元素是有穷的(非inf、非NaN)”或者“那些元素是无穷的”的布尔型数组 |
np.isfinite(arr) np.isinf(arr) |
|
cos、cosh、sin、sinh、tan、tanh |
普通以及双曲型三角函数 |
np.cos(arr) np.sin(arr) np.tan(arr) |
|
arccos、arccosh、arcsin、arcsinh、arctan、arctanh |
反三角函数 |
np.arccos(arr) np.arrsin(arr) np.arrtan(arr) |

ndarray-通用函数/常用函数(二元函数)
|
二元ufunc |
描述 |
调用方式 |
|
mod |
元素级的取模 |
np.mod(arr1,arr2) |
|
dot |
求两个数组的点积 |
np.dot(arr1,arr2) |
|
greater、greater_equal、less、less_equal、equal、not_equal |
执行元素级别的比较运算,最终返回一个布尔型数组 |
np.greater(arr1, arr2) np.less(arr1, arr2) np.equal(arr1, arr2) |
|
logical_and、logical_or、logical_xor |
执行元素级别的布尔逻辑运算,相当于中缀运算符&、|、^ |
np.logical_and(arr1,arr2) np.logical_or(arr1,arr2) np.logical_xor(arr1,arr2) |
|
power |
求解对数组中的每个元素进行给定次数的指数值,类似于: arr ** 3 |
np.power(arr, 3) |

-
聚合函数
聚合函数是对一组值(eg一个数组)进行操作,返回一个单一值作为结果的函数。当然聚合函数也可以指定对某个具体的轴进行数据聚合操作;常将的聚合操作有:平均值、最大值、最小值、方差等等


(这里的axis与索引图相反,需要注意)

-
np.where函数
np.where函数是三元表达式x if condition else y的矢量化版本

案例:将数组中的所有异常数字替换为0,比如将NaN替换为0

-
np.unique函数
np.unique函数的主要作用是将数组中的元素进行去重操作(也就是只保存不重复的数据)

本文介绍了Python科学计算库NumPy,重点讲解了其核心数据结构ndarray,包括创建、属性、数据类型、形状修改以及基本操作。通过实例展示了如何创建、操作和使用ndarray,如array、zeros、ones、empty函数,以及reshape、astype方法。还讨论了ndarray的索引、切片、转置和通用函数(ufunc),如np.where和np.unique的功能和使用。
NumPy包(理论+动手实践)&spm=1001.2101.3001.5002&articleId=99981444&d=1&t=3&u=f7f413fedaa643db90174133040ec233)
1388

被折叠的 条评论
为什么被折叠?



