numpy高级函数操作之——select、choose
一、什么是np.select()
顾名思义,这个函数用用来“ 根据某一些条件 ” 来筛选出 “某一些元素 ”的函数,比如我有一个数组,我如果用if-else语句去做,当然也可以,比如我们让小于6的元素各自加上10,大于等于6的元素统统变为100,我们可以这么做,代码如下:
a=np.array([1,2,3,4,5,6,7,8,9,10])
aaa=[] #存储筛选结果的列表
for i in a: #通过循环去完成if(i<6):i=i+10else:i=100aaa.append(i)print(aaa)
运行结果为 [11, 12, 13, 14, 15, 100, 100, 100, 100, 100]
但是这样做的缺点就是效率太过于低下,因为这样做就是使用循环,条件判断去完成,select()函数就是专门针对这种情况提出来的。
1、select函数的定义
def select(condlist, choicelist, default=0):
condlist参数:操作数据所依据的条件
choicelist参数:根据condlist条件,索要执行的操作
返回值:返回的是一个“ 列表” 。
注意上面的condlist和choicelist都必须是写成“ 列表 ”的形式。
要实现上面同样的操作,这里只需要一句话就可以完成
a=np.array([1,2,3,4,5,6,7,8,9,10])
condlist=[a<6] #第一个参数,必须用【】括起来,列表形式
print(condlist)
choicelist=[a+10] #第二个参数,必须用【】括起来,列表形式
print(choicelist)
aa=np.select(condlist,choicelist,default=100)
print(aa)
程序运行的结果为:
[array([ True, True, True, True, True, False, False, False, False,False])]
[array([11, 12, 13, 14, 15, 16, 17, 18, 19, 20])]
[11 12 13 14 15 100 100 100 100 100] #由此可见,依然得到的是上面的结果。
什么意思呢?可以这样理解,对于第一个参数condlist=[ a<6 ],我们将a<6看成是一个条件,只不过这个条件是针对array类型的a的,第二个参数choicelist所要执行的操作是依据condlist而言的,即这里的 [a+10]里面的a+10这个操作,和 [a<6]这个里面的,a<6是对应关系的,即当第一条件里的每个元素满足条件的时候,即为True的时候,就执行相应的操作,如果为false,那么久不执行,而对于不满足的元素,则执行默认的值,即default。
2、select() 对于多条件、多操作的筛选和执行
比如针对一个数组,我们规定小于6的就加上10,介于10~15之间的就平方,大于20的就乘以10,其他的就默认变为100.
a=np.array([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20],[21,22,23,24,25]])
condlist=[a<6,np.logical_and(a>10,a<16),a>20] #参数一,定义三个限制条件
print(condlist)
choicelist=[a+10,a**2,a*10] #参数二,定义三个不同的操作
print(choicelist)
aa=np.select(condlist,choicelist)
print(aa)print('=======================================')
运行结果为:
[[ 11 12 13 14 15] #第一行分别加上了10
[ 0 0 0 0 0]
[121 144 169 196 225] #第三行每个数分别进行了平方
[ 0 0 0 0 0]
[210 220 230 240 250]] #第五行每个数分别乘以10
3、select函数总结
参数一,condlist=【条件一,条件二,条件三,,,,】
参数二,choicelist=【操作一,操作二,操作三,,,,,】
只有每个条件中,对应为true的才会执行相对应的操作,最终所有条件都不满足的元素,则执行默认值default。
二、np.choose()函数
choose()函数,顾名思义,也是通过某一些条件去“选择”相关的元素,choose的操作会比自己使用for-if-else效率要高。
1、choose()函数的定义
def choose(a, choices, out=None, mode='raise'):
参数 a :它必须是一个 int 型的 数组,并且 a 中的元素,必须是0~n-1之间的数,这里的n表示的就是数组choices数组最外层的维度数。
choices:表示的是要操作的数组,要注意的是choices的数组的维度是一定要和a进行匹配的,如果匹配不了,会出现错误。
参数out:接收运算结果的数组,它的维度一定要和 a 是一样的,是可选参数。
参数mode:默认的是raise,表示的是a数组中的元素不能超过 n ,她还有两个可选值,
clip:将 a 中的 元素 如果小于0,则将其变为0,如果大于n-1,则变为n-1
wrap:将a中的值 value变为value mod n,即值除以n的余数。
2、choose的应用
(1)当a和choices都是相同维数的时候——a为1维,choices为1维
result=np.array([0,0,0,0,0])
aa=np.choose([4,2,1,3,0],[11,22,33,44,55],out=result) #当a,与choices的尾数相同的时候
print(aa)
print(result) #result是out输出的,这里和aa的结果是一样的
运行结果:
[55 33 22 44 11]
[55 33 22 44 11] #二者的结果是一样的,这个地方使用了out,mode参数使用的是默认值
总结:因为choices的 n 为5,所以 a 中的元素不能够超过5 ,它代表的是 choices中的 索引index。11对应0,22对应1,33对应2,44对应3,55对应4.
(2)当a的维数比choices的维数多的时候——a为2维,choices为1维
bb=np.choose([[4,2,1,3,0],[3,4,2,0,1],[0,2,1,4,3]],[11,22,33,44,55])
print(bb)
运行结果为:
[[55 33 22 44 11]
[44 55 33 11 22]
[11 33 22 55 44]] # a 中的每一个索引 都分别与choices 对应着的。
(3)当a的维数比choices的维数少的时候——a为1维,choices为2维
cc=np.choose([4,2,1,3,0],[[11,22,33,32,31],[44,55,66,65,64],[77,88,99,98,97],[111,222,333,332,331],[444,555,666,665,664]])
print(cc)
运行结果为:
[444 88 66 332 31] # 444 对应于 choices[4,0],88对应于 choices[2,1],66 对应于 choices[1,2],332 对应于 choices [3,3],31 对应于 choices[0,4]
总结:由此可知,choices的最外层索引index依然是与a进行匹配的,但是内层索引是按照从0开始,0、1、2、3、4逐渐递增的。鉴于此,choices的内层元素数量依然要与a的个数进行匹配才行,否则会报错。
(4)当a的维数和choices的维数都是多维的时候——a为2维,choices为2维
dd=np.choose([[4,2,1,3,0],[3,4,2,0,1],[0,2,1,4,3]],[[11,22,33,32,31],[44,55,66,65,64],[77,88,99,98,97],[111,222,333,332,331],[444,555,666,665,664]])print(dd)
运行结果为:
[[444 88 66 332 31]
[111 555 99 32 64]
[ 11 88 66 665 331]] #运算过程同上面的 (3)是类似的
总结:从上面的几个例子可以看出,choose最终的输出结果是和 a 一样的。a中的数值不能超过choices的索引值,但是没有要求一定要a和choices维度相同。
3、choose的综合应用
a=[[1,0,2],[2,1,0],[2,0,1]]
c1=[[1,2,3],[4,5,6],[7,8,9]]
c2=[[11,22,33],[44,55,66],[77,88,99]]
choices=[c1,100,c2]
result=np.choose(a,choices)
print(result)
运行结果为:
[[100 2 33]
[ 44 100 6]
[ 77 8 100]] #原理同上
再例如:
a = [[1, 0, 1], [0, 1, 0], [1, 0, 1]]
choices = [-10, 10]
result=np.choose(a, choices)
print(result)
结果为:
[[ 10, -10, 10],
[-10, 10, -10],
[ 10, -10, 10]]
numpy高级函数操作之——select、choose相关推荐
- 总结了12个Numpy高级函数,完美解决数据处理,拿来即用!
作者 | 黄伟呢 责编 | 欧阳姝黎 原本是不想专门讲述Numpy函数的,但是今天又有人问起.为此给大家总结了这12个Numpy高级函数,大家一定要掌握,因为它真的很好用!很好用!很好用! ...
- 读取mysql数据到select_MySQL数据库8(十三)高级数据操作之select指令
查询数据 完整的查询指令: select select选项 字段列表 from 数据源 where 条件 group by 分组 having 条件 order by 排序 limit 限制 se ...
- python数组去重函数_Python科学计算库Numpy之 数组操作
操作ndarray 的方法 numpy.reshape:这个函数在不改变数据的条件下修改形状 numpy.ndarray.flat:该函数返回数组上的一维迭代器,行为类似 Python 内建的迭代器 ...
- Numpy高级操作大全!!!
文章目录 一.数组上的迭代 二.数组形状修改函数 1.ndarray.reshape 2.ndarray.flat 3.ndarray.flatten 三.数组翻转操作函数 1.numpy.trans ...
- Numpy 高级操作大全
作者:CSDN-逐梦er blog.csdn.net/qq_43328040/article/details/108700665 一.数组上的迭代 NumPy 包含一个迭代器对象numpy.ndite ...
- 这 10 种Numpy高级操作你都会吗?
来源: CSDN-逐梦er 一.数组上的迭代 NumPy 包含一个迭代器对象numpy.nditer.它是一个有效的多维迭代器对象,可以用于在数组上进行迭代.数组的每个元素可使用 Python 的标准 ...
- 【numpy操作】numpy的函数
文章目录 前言 一.数组的拼接与切分 1 np.hstack()和np.vstack() 2 np.hsplit()和np.vsplit() 二. numpy其他函数 1.np.hypot(x1,x2 ...
- numpy高级教程之np.where和np.piecewise
欢迎关注"勇敢AI"公众号,更多python学习.数据分析.机器学习.深度学习原创文章与大家分享,还有更多电子资源.教程.数据集下载.勇敢AI,一个专注于人工智能AI的公众号. = ...
- numpy、pandas操作
numpy.pandas操作 pandas介绍 numpy介绍及使用 numpy简介 numpy使用 Pandas操作 Pandas数据结构 Series结构:列表,会自动创建索引 Series的创建 ...
最新文章
- HDLBits 系列(16)Something about Counter
- [蓝桥] 基础练习 回文数
- Android—简单路由框架实践
- java流与文件——ZIP文档
- Pytorch LSTM初识(详解LSTM+torch.nn.LSTM()实现)1
- 独家:Havok 发布新的 AI 中间件
- Zabbix 最新版 5.2 版本源码安装
- 零基础也能学会的小游戏编程!入门级别实践
- 研究生必须过计算机和英语吗,计算机考研考英语一还是英语二
- Android 连接SQLite
- 解决 应用程序无法启动(0xc000007b),请单击确定关闭应用程序
- Edraw Office Viewer Component
- 3dmax的贴图烘焙
- java中axis是什么意思_如何理解Axis?
- 2021 中国开源码力榜启动,寻找开源世界的超级码丽
- 四选一多路开关电路描述
- k8s学习-Secret(创建、使用、更新、删除等)
- 责任链模式与lambda重构责任链模式
- Rust笔记——解决 Blocking waiting for file lock on build directory
- JSP类计算机专业毕业设计题目课题选题
热门文章
- 免费ftp服务器FileZilla Server配置
- java char unicode_在Java的基本数据类型中,char型采用Unicode编码方案,每个Unicode码占用______字节内存空间,这样,无论是中文_搜题易...
- 软碟通制作U盘Ubuntu14.04启动盘
- NLP|中文分词技术及应用
- 嵌入式实时软件平台TOPPERS/ASP简介
- ASP.NET 使用MQTT实现通信 简介
- 20年会计应届生转行软件测试,拿下8k+offer是如何做的
- phantomjs 配置和使用
- 机器学习实战—使用FP-growth算法来高效发现频繁项集
- 2021年证券类APP更新迭代监测专题分析(中)发布