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+10

    else:

        i=100

    aaa.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]]

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • [{"reportDate": "2018-01-23 23:28:49","fluctuateCause": n...
    加勒比海带_4bbc阅读 765评论 1 2
  • 基础篇NumPy的主要对象是同种元素的多维数组。这是一个所有的元素都是一种类型、通过一个正整数元组索引的元素表格(...
    oyan99阅读 5,098评论 0 18
  • 删掉重新来一次吧,记得改那个脚本修改 /home/ubuntu/eos/scripts/install_depen...
    卢衍泓阅读 1,098评论 0 1
  • 我有神奇功能:我能够为每一个所偷来的影子找到点亮生命的小小光芒,为他们找回隐匿的记忆拼图。 童年,我为心仪的伊丽莎...
    燕纪事阅读 343评论 0 0
  • 效果:倒计时: Body部分: 距离下课还有: || JS部分: function timer(){ ...
    王wl阅读 399评论 0 0