当前位置: 首页 > article >正文

Numpy基础用法

Numpy 【Numerical Python】是一个开源的Python科学计算库,用于快速处理任意维度的数组。Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy比直接使用Python要简洁的多。Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。

import numpy as np
# 创建一个二维ndarray对象
score=np.array([[1,2,3],[4,5,6],[7,8,9]])

1. ndarray相对于list优势

Numpy专门针对ndarray的操作和运算进行了设计,所以数组的存储效率和输入输出性能远优于Python中的嵌套列表,数组越大,Numpy的优势就越明显。

这是因为**ndarray中的所有元素的类型都是相同的,而Python列表中的元素类型是任意的**,所以ndarray在存储元素时内存可以连续,而python原生list就只能通过寻址方式找到下一个元素,这虽然也导致了在通用性能方面Numpyndarray不及Python原生list。但在科学计算中,Numpyndarray就可以省掉很多循环语句,代码使用方面比Python原生list简单的多。

Numpy底层使用C语言编写,内部解除了GIL【全局解释器锁】,其对数组的操作速度不受Python解释器的限制,所以,其效率远高于纯Python代码。

2. ndarray的属性

属性名字属性解释
ndarray.shape数组维度的元组
ndarray.ndim数组维度
ndarray.size数组中的元素数量
ndarray.itemsize一个数组元素的长度【字节】
ndarray.dtype数组元素的类型

可以调用这些属性得知ndarray的基本情况

3. ndarray的类型

类型类型代码描述
int8,uint8i1,u1有符号和无符号的8位整数
int16,uint16i2,u2有符号和无符号的16位整数
int32,uint32i4,u4有符号和无符号的32位整数
int64,uint64i8,u8有符号和无符号的64位整数
float16f2半精度浮点数
float32f4或f标准单精度浮点数
float64f8或d标准双精度浮点数
float128f16或g拓展精度浮点数
complex64c8,c16,c32分别基于32位,64位,128位浮点数的复数
complex128👆
complex256👆
bool?布尔值,存储TrueFalse
objectoPython object类型
string_S修正的ASCII字符串类型,例如生成一个长度为10的字符串类型,使用S10
unicode_U修正的Unicode类型,生成一个长度为10Unicode类型,使用U10
import numpy as np
# 创建一个二维ndarray对象,指定元素类型为float32,dtype='f4'与之等价
score=np.array([[1,2,3],[4,5,6],[7,8,9]],dtype=np.float32)
# 使用astype()方法可以显示转换类型,tobytes()改为字节型
score = score.astype(np.float64)

若不指定,整数默认int64,小数默认float64

4. 生成ndarray的方法

numpy库的导入语句在后续例子中省略

  • np.array(list):将输入数据(可以是列表、元组以及其他序列)转换为ndarray,如不显式指明数据类型,将自动推断;默认复制所有的输入数据

    asarray(list):将输入转换为ndarray,但如果输入已经是ndarray则不再复制

    import numpy as np
    data = np.array([[1.5, -0.1, 3], [0, -3, 6.5]])
    print(data)
    
    image-20230411173506006
  • np.arrage(start,stop,step)Python内置函数range的数组版,返回一个数组

    生成范围[start,stop),步长为stepndarrystart默认为0step默认为1

    # 生成的数组a为:[1,3,5]
    a = np.arange(start=1, stop=6, step=2)
    
  • np.ones((shape),dtype):生成指定shape的全1数组,dtype默认为float64

    np.ones_like(arr):根据所给数组生成一个形状一样的全1数组

    a = np.ones((2, 3), dtype='f4')
    print(a)
    
    image-20230411181548186
  • np.zeros((shape),dtype):生成指定shape的全0数组,dtype默认为float64

    np.zeros_like(arr):根据所给数组生成一个形状一样的全0数组

    使用方式如上ones方法👆

  • np.empty((shape),dtype):生成指定shape的没有初始化值的空数组,dtype默认为float64

    np.empty_like(arr):根据所给数组生成一个形状一样的没有初始化值的空数组

  • np.full((shape), fill_value,dtype):生成指定shape的值全为fill_value的数组,dtype默认为int64

    np.ones_like(arr):根据所给数组生成一个形状一样的值全为fill_value的数组

    a = np.full(shape=(2, 3), fill_value=5)
    
    image-20230411182531467
  • np.identity(n,dtype):生成n*n的矩阵,对角线元素全1,其余全0dtype默认为float64

4.1 伪随机数生成

  • np.random.randint(low,high,(size)):生成size形状【sizeint时一维】的数组,其值在[low,high)之间

    # 生成3*3的矩阵,其值在[3,5)之间
    score = np.random.randint(3, 5, (3, 3))
    
    image-20230411184051732
  • np.random.rand(shape) :生成shape形状的数组,值为[0,1)内的一组均匀分布数,用法与正态分布的randn类似👇

  • np.random.uniform(low=0.0,high=1.0,size=None):从一个均匀分布[low,high)中随机采样,形状与size中描述一致

    score = np.random.uniform(low=0.0, high=1.0, size=(3, 3))
    
    image-20230411190739420
  • np.random.randn(shape):生成shape形状的数组,其值是标准正态分布随机数

    score = np.random.rand(3, 3)
    
    image-20230411184625869
  • np.random.normal(loc=0.0, scale=1.0, size=None):传入μ和从而得到正态分布

    • locfloat类型,正态分布的均值【 μ \mu μ,此值是正态分布峰值横坐标】
    • scalefloat类型,正态分布的标准差【σ,此值越大图形越胖,越小越高】
    • size:输出的shape,默认为None,只输出一个值
    # 生成均值为1.75,标准差为1的正态分布数据,5个
    score = np.random.normal(1.75, 1, 5)
    
    image-20230411185547043

numpy.random中其他伪随机数方法

函数描述
seed确定随机数生成器的种子
permutation返回一个序列的随机排列或返回一个随机排列的范围
shuffer对一个序列就地随机排列
binomial产生二项分布的样本值
beta产生Beta分布的样本值
chisquare产生卡方分布的样本值
gamma产生Gamma分布的样本值

5. ndarray形状修改

np.reshape(shape)/resize(new_shape)/T

reshape返回一个具有相同数据域,但形状不一样的视图;resize则是在原数组上进行修改;T则是ndarray的一个属性,表示转置后的ndarray

# 在转换形状的时候,一定要注意数组的元素匹配
arr = np.array([[1,2,3],[4,5,6]])
# 将arr由2行3列修改为3行2列
arr = arr.reshape([3,2])
# 将arr修改为3列,行数通过内部计算得到,目前待定
arr.reshape((-1,3)) 

6. ndarray进行数据筛选

6.1 逻辑运算

# 生成4行6列的矩阵,取值在[3,5)之间
arr = np.random.randint(3,5,[4,6])
# arr取行下标为2之后的行以及列下标为4【不包括】之前的列构成新数组arr1
# 逗号左边是行的取值情况,右边是列的取值情况,分别切片
arr1 = arr[2:,:4]
# arr1中大于3的赋为True,其余赋为False,得到一个新的布尔类型数组
bool_arr = arr1 > 3
# 将arr1中大于3的部分赋值为1
arr1 [ bool_arr ] = 1

6.2 通用判断函数

# 每行代表不同学生,每列代表不同科目
score = np.array([[70, 60, 81], [99, 97, 94], [30, 52, 79]])
# 判断前两名同学的成绩是否全及格,全部及格返回True
flag = np.all(score[:2, :] > 60)
# 判断前两名同学的成绩是否有大于80分的,有一个就返回True
np.any(score[:2, :] > 80)

6.3 三元运算符

# arr1中大于1的部分赋1,其余赋0
np.where(arr1 > 1, 1, 0)
# 复合逻辑需要结合np.logical_and和np.logical_or使用
# arr1中大于60且小于90的部分赋1,其余赋0
np.where(np.logical_and(arr1 > 60, arr1 < 90), 1, 0)
# arr1中大于60或者小于50的部分不变,其余赋0
np.where(np.logical_or(arr1 > 60, arr1 < 50), arr1, 0)

7. ndarray的运算

任何在两个等尺寸数组之间的算术操作都应用了逐元素操作的方式

a=np.array([[2,3],[4,5]])
b=np.array([[1,2],[3,4]])

# 对应元素相乘(除,加,减)
a *[/,+,-] b

# a矩阵每个元素取倒数
1 / a

# a矩阵每个元素的0.5次方
a ** 0.5

# 同形状数组比较,返回布尔数组 
a > b

7.1 常用一元通用函数

通用函数ufunc是一种对ndarray中的数据执行元素级运算的函数。你可以将其看做简单函数(接受一个或多个标量值,并产生一个或多个标量值)的矢量化包装器

一元通用函数指对一个ndarray操作的通用函数

函数说明
abs,fabs计算整数、浮点数或复数的绝对值。对于非复数值,可以使用更快的fabs
sqrt计算各元素的平方根(等价于arr ** 0.5
square计算各元素的平方,(等价于arr **2
exp计算各元素的自然指数值 e x e^x ex ,其中x是数组元素
log, log10, log2, log1p分别为底数为e, 底数为10, 底数为2,底数为1+xlog
sign计算各元素的正负号:1(正数),0(零),-1(负数)
ceil计算大于等于该值的最小整数
floor计算小于等于该值的最大整数
rint将各元素值四舍五入到最接近的整数,保留dtype
modf将数组的小数和整数部分以两个独立数组的形式返回【两个接收值】
isnan返回一个表示“哪些值是NaN”的布尔型数组
isfinite,isinf分别返回一个表示“哪些元素是有穷的(非inf,非NaN)”或“哪些元素是无穷的”的布尔型数组
cos,cosh,arccos普通型,双曲型三角函数和反三角函数【sin,tan有类似用法】
logical_not计算各元素not x的真值,相当于~arr

7.2 常用二元通用函数

函数说明
add将数组中对应的元素相加
subtract从第一个数组中减去第二个数组中的元素
multiply数组元素相乘
divide,floor_divide除法或向下圆整除法【丢弃余数】
power对第一个数组中的元素A,根据第二个数组中的相应元素B,计算 A B A^B AB
maximum,fmax保留同一位置中的最大值,fmax将忽略NaN元素级的最小值计算【min用法类似】
mod对第一个数组中的元素A,根据第二个数组中的相应元素B,计算A%B
copysign将第二个数组中的值的符号复制给第一个数组中的值
greater,greater_equal
less,less_equal
equal,not_equal
执行元素级的比较运算,最终产生布尔型数组
相当于运算符>、>=、<、<=、==、!=
logical_and
logical_or
logical_xor
执行元素级的真值逻辑运算
相当于运算符`&、

7.3 常用统计函数

方法说明
sum对数组中全部或某轴向【axis参数】的元素求和,零长度sum0
布尔值存储True强制为1False0,因此可用于统计True个数
mean算数平均数,零长度的数组的meanNaN
std,var分别为标准差和方差,自由度可调(默认为n
min,max最大值和最小值
argmin,argmax分别为最大和最小元素的索引
cumsum所有元素的累计和
cumprod所有元素的累计积

7.4 常用集合操作

方法描述
unique计算数组中的唯一元素,并返回有序结果【一维】
intersect1d计算xy中的公共元素,并返回有序结果【一维】
union1d计算xy的并集,并返回有序结果【一维】
in1d得到一个表示“x的元素是否包含于y”的布尔型数组
setdiff1d集合的差,即元素在x中且不在y
setxor1d集合的对称差,即存在于一个数组中但不同时存在于两个数组中的元素

7.5 线性代数

Numpy的线性代数*是矩阵逐元素乘积,而不是矩阵点乘积【点乘是@】,T属性是矩阵转置

7.5.1 numpy常用线代方法

方法说明
diag以一维数组的形式返回方阵的对角线元素,或将一维数组转换为方阵(非对角线元素为0)
dot矩阵点乘【效果与@运算符一致】
trace计算对角线元素和【迹】

7.5.2 numpy.linalg常用方法

numpy.linalg拥有一个矩阵分解的标准函数集以及其他常用函数,例如求逆和行列式求解等

方法说明
det计算矩阵行列之
eig计算方阵的特征值和特征向量
inv计算方阵的逆矩阵
pinv计算矩阵的Moore-Penrose伪逆
qr计算QR分解
svd计算奇异值分解【SVD
solve解线性方程组Ax = b,其中A为一个方阵
lstsq计算Ax = b的最小二乘解

http://www.kler.cn/a/9460.html

相关文章:

  • MySQL高级(二):一条更新语句是如何执行的
  • python解析网页上的json数据落地到EXCEL
  • Redo与Undo的区别:数据库事务的恢复与撤销机制
  • SpringMVC学习笔记(二)
  • 【QT常用技术讲解】优化网络链接不上导致qt、qml界面卡顿的问题
  • Jetpack 之 Ink API初探
  • Android中的接口回调机制
  • 时光煮雨,岁月缝花
  • 两亲性聚合物Stearic acid PEG acid,STA-PEG-acid,硬脂酸聚乙二醇羧酸
  • LAMP架构的配置
  • Flink CDC 自定义反序列化
  • java 合作社交易系统Myeclipse开发mysql数据库mvc结构serlvet编程计算机网页项目
  • 多维时序 | MATLAB实现GRU门控循环单元多变量时间序列预测(多指标评价)
  • 【大数据开发运维解决方案】ssh: undefined symbol: EVP_KDF_ctrl, version OPENSSL_1_1_1b问题解决过程
  • 【Java面试八股文宝典之RabbitMQ篇】备战2023 查缺补漏 你越早准备 越早成功!!!——Day17
  • QT桌面的构建
  • es6和commonJs的区别
  • 医院设备管理的数字化转型:二维码巡检系统的实施与应用
  • 【Java数据结构】线性表-顺序表
  • gopls有没有什么很强大但是默认不开启的功能?
  • cursor.execute 执行两个结果并存储给变量
  • 【c语言】二维数组
  • SpringBoot案例
  • 从零开始学架构——高性能缓存架构
  • 【前端面试专题】【5】Vue3
  • sqlmap使用(以sqli-lab为例)