Python Numpy算法操作

本文详细介绍Numpy的安装、特点、基本操作、数组算术、广播机制、数组拼接、切片、文件读写、随机模块、常用函数等内容,是Python数值计算的重要指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. Numpy安装
    在cmd中使用pip install numpy进行安装

  1. Numpy简介
    Numpy(Numerical Python)是目前Python数值计算中最为重要的基础包。大多数计算包都提供了基于Numpy的科学函数功能,将Numpy的数组对象作为数据交换的通用语。

特点
• 提供高效多维数组
• 提供了基于数组的便捷算术操作以及广播机制
• 对数据进行快速的矩阵计算
• 对硬盘中数组数据进行读写操作


  1. Numpy基本操作

需要import numpy as np

基本方法
np.array(object,dtype = None)将输入数据转换为ndarray数组,自动推断数据类型,默认复制所有输入数据
np.asarray(object,dtype = None)将输入数据转换为ndarray数组,但输入数据已经是ndarray则不再复制
np.arange(start,end,step)生成一个数组
arr.astype(dtype)修改数组类型
np.zeros(shape)根据给定形状和数据类型生成全0数组
np.ones(shape)根据给定形状和数据类型生成全1数组
np.empty(shape)根据给定形状和数据类型生成一个没有初始化数值的空数组
np.full(shape,num)根据给定形状和数据类型生成一个没有初始化数值的空数组
np.where(condition,[x,y])筛选出数组中满足条件的元素,对其进行修改,如果满足condition修改为x,不满足condition修改为y(如果只有conditon 则返回满足元素的行和列)
arr.clip(min,max)将小于min的改为min,将大于max的改为max
np.count_nonzero()计算非零的个数
np.sign(arr)将数组中的值标签化,大于0的变成1,小于0的变成-1
np.sort(arr,axis)排序,默认为最后一个轴排序,axis:指定轴
np.linspace(start,stop,num)将制定区间等分为多少份
np.unique(data,return_counts)返回并不重复arr中所有的元素,在指定return_counts = True 返回不重复元素出现的次数
数组属性
arr.ndim查看数组的维度,返回值为整数
arr.shape查看数组每个维度的值,返回值为元组

  1. 数组的数据类型
    (一个数组中只存在一种数据类型)
类型类型代码描述
int8,uint8i1,u1有符号和无符号的8数位整数
int16,uint16i2,u2有符号和无符号的16数位整数
int32,uint32i4,u4有符号和无符号的32数位整数
int64,uint64i8,u8有符号和无符号的64数位整数
float16f2半精度浮点数
float32f4标准单精度浮点数
float64f8标准双精度浮点数
bool?布尔值,存储True或False
string_SASCII字符串类型,eg:‘S10’
unicode_UUnicode类型,eg:‘U10’

  1. 数组的维度
    (数组的维度,可理解为套娃,一层套一层,取出从外往里取)
    一维
    在这里插入图片描述二维
    在这里插入图片描述三维
    在这里插入图片描述

  1. 重塑数组
方法
arr.reshape(shape,order = “C”)将一维数组转多维,shape:元组(所有数乘积必须与所有元素数量相等),order:1.“C” 顺序 2.“F” 逆序
arr.flatten()将多维数组转一维
arr.ravel()将多维数组转一维
arr.transpose()(转置)行列转换
arr.T(转置)行列转换
arr.swapaxes()(换轴)(相当于行列转换)(0代表行,1代表列)

  1. 数组的拷贝

不拷贝 (指向,引用)(相当于c语言指针)

import numpy as np
arr = np.arange(10)
arr_2 = arr

浅拷贝 (复制表层,引用深层)

import numpy as np
arr = np.arange(10)
arr3 = arr.view()
print(arr3 is arr)
arr3[0] = 10
print(arr)

深拷贝 (复制全部)

import numpy as np
arr = np.arange(10)
arr3 = arr.copy()
print(arr3 is arr)
arr3[0] = 10
print(arr)

  1. Numpy数组算数
    数组之所以重要是因为它允许我们进行批量操作数据并且没有任何for循环。也被称为向量化。

数组与标量的算术操作
数组与标量的算术操作会把计算参数传递给数组的每一个元素。

import numpy as np
arr = np.arange(6).reshape(2,3)
arr+1

两个等尺寸数组的算术操作
两个等尺寸数组的算术操作实际上是逐元素操作。

arr = np.arange(1,7).reshape(2,3)
arr
arr+arr   
arr/arr  
arr-arr

广播机制
广播机制规则:如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为他们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。

与列数相同并且只有1行的数组之间进行运算 (将自动补齐所有行)
在这里插入图片描述
与行数相同并且只有1列的数组之间进行运算(将自动补齐所有列)
在这里插入图片描述
注意:(维度完全不一致,则无法广播。)


  1. 数组的拼接
方法
np.vstack(arr1,arr2)垂直拼接
np.hstack(arr1,arr2)水平拼接

(水平拼接需要对应行数一致,垂直拼接需要对应列数一致。)


切片

神奇索引:元组构成,元组中的每个元素代表一个索引
语法:(索引,索引,索引…)

布尔索引:表达式构成,其中逻辑运算符用 &| 代替 andor , 取出满足表达式的值,组成一维的ndarray
语法:[arr_name 运算符 num]

索引:按索引范围取元素,也可在间隔取元素(左闭右开原则)
语法:[ start : end : step ]


(取值和列表类似,维度之间相乘即可,可参考Python列表切片及方法
关于维度问题:维度不同,只是索引多少问题,并不以影响切片

(不同点只在于修改数组时,修改数组时并不会改变数组的行列数,只会改变数组的所取的元素值,遵循 多对一,shape对应 原则即可)


当只取多行单个元素
(当赋值多个元素时,要求元素个数相同)

import numpy as np
arr = np.arange(10).reshape(2,5)
#one
arr[:,1] = 2,2 
#two
arr[:,1] = 2 

one的值:[[0 2 2 3 4] [5 2 7 8 9]]
two的值:[[0 2 2 3 4] [5 2 7 8 9]]


当取多行多个元素时
(赋值多个元素时,要求shape相同)

import numpy as np
arr = np.arange(10).reshape(2,5)
arr2 = np.arange(4).reshape(2,2)
#one
arr[:,1:3] = arr2 
#two
arr[:,1:3] = 1 

one的值:[[0 0 1 3 4] [5 2 3 8 9]]
two的值:[[0 1 1 3 4] [5 1 1 8 9]]


当取单行多个元素时
(赋值多个时,只需要元素个数与赋值个数对应即可)

import numpy as np
arr = np.arange(10)
#one
arr[1:4] = 3,2,1
#two
arr[1:4] = 1

one的值:[0 3 2 1 4 5 6 7 8 9]
two的值:[0 1 1 1 4 5 6 7 8 9]


当取单行多个元素时
(取单个元素不允许赋多个值)

import numpy as np
arr = np.arange(10)
#one
arr[1] = 3

one的值:[0 3 2 3 4 5 6 7 8 9]


(主要原理自己体会,没时间解释,快上车~)


  1. 文件读写操作

写入本地数据
通过:

savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n', header='', footer='', comments='# ', encoding=None)
np.savetxt()(属性)
fname文件名及路径
X需要写入的文件数据
fmt写入数据的格式
delimiter分隔符
newline每行数据写入之后,默认为换行
header表头
footer表尾
comments将其标记为注释,默认在开头加一个#号
encoding编码

读取本地数据
通过:

loadtxt(fname, dtype=<class 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding='bytes', max_rows=None)
np.loadtxt()(属性)
fname文件名及路径
dtype指定类型
comments默认为注释,在最前面加上#号
delimiter分隔符
converters对数据预处理。比如{0:func}第0列进行func函数预处理
skiprows跳行读取,指定从第几行开始读取
usecols指定取出的列
unpack对数据进行打包
ndmin指定维度
encoding编码
max_rows读取skiprows之后的最大行数

  1. NaN与inf
    nan: not a number 表示不是一个数字,属于浮点类。
    inf: np.inf 表示正无穷,-np.inf表示负无穷,属于浮点类。

nan 特点:

  • 两个nan是不相等的
  • np.isnan() 判断数组元素是否是NaN,返回为bool值
  • np.nan与任何数值计算都是nan

  1. numpy中的random模块函数
    导入numpy模块之后,直接通过np.random.函数名,即可调用函数
函数
randint(min,max,size = shape)生成shape形状数组 ,内容随机
seed(num)指定随机数生成时所用算法开始的整数值
choice(data,size = shape)生成shape形状数组,内容随机为data里的数
shuffle(arr)将arr中所有元素顺序打乱
rand()生存shape形状数组,内容随机为[0,1)之间的数
randn()生成shape形状数组,内如随机为均值(μ)为0,标准差(σ)为1的标准正态分布的值

  1. 常用函数

聚合函数
聚合函数相比python内置函数,更加高效迅速且快捷

方法
arr.mean(axis,detype)求平均值,axis:指定轴,detype:指定类型
np.sum(arr,axis)求和,axis:指定轴
np.min(arr,axis)求最小值,axis:指定轴
np.max(arr,axis)求最大值,axis:指定轴
np.argmin(arr,axis)求最小值索引,axis:指定轴
np.argmin(arr,axis)求最大值索引,axis:指定轴
np.var(arr)求方差,样本数据 跟 均值之间的偏离程度
np.std(arr)求标准差,标准差是方差的算符平方根(有正负),(反应数据的波动性)
np.ptp(arr,axis)求极值,axis:指定轴
np.median(arr,axis)求中值,axis:指定轴
np.cumsum(arr,axis)累计和(求出数组每前n个数相加的和,从0开始累积),axis:指定轴

(算数运算,出现nan,有对应的nan方法,大部分在方法前加上nan即可)


一元函数
(只有一个参数)

方法
np.abs绝对值
np.sqrt开平方
np.square(arr)平方
np.expe的次方
np.np.log,np.log10,np.log2,np.log1p求以e为底,以10为低,以2为低,以(1+x)为底的对数
np.ceil向上取整,比如5.1会变成6,-6.9会变成-6
np.floor向下取整,比如5.9会变成5,-6.1会变成-7
np.rint,np.round四舍六入五双飞
np.modf将整数和小数分隔开来形成两个数组
np.isnan判断是否是nan
np.isinf判断是否是inf
np.cos,np.cosh,np.sin,np.sinh,np.tan,np.tanh三角函数

二元函数
(只有两个参数)

函数
np.add加法运算(即1+1=2),相当于+
np.subtract减法运算(即3-2=1),相当于-
np.negative负数运算(即-2),相当于加个负号
np.multiply乘法运算(即23=6),相当于
np.divide除法运算(即3/2=1.5),相当于/
np.floor_divide取整运算,相当于//
np.mod取余运算,相当于%
greater,greater_equal,less,less_equal,equal,not_equal>,>=,<,<=,=,!=的函数表达式
logical_and& 的函数表达式
logical_or| 的函数表达式

布尔函数

函数
np.any()只要有一个元素为True,返回值就为True
np.all()只要有一个元素为False,返回值就位False,否则为True
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值