Numpy:根据多个条件,对数组每个元素做操作

在深度学习中,如果想对数组的每个元素,根据数组范围来划分标签,就需要根据”多个条件“对数组中的”每个元素“做操作(不同区间的数,打上不同的标签)!

操作:a[ (条件1) & (条件2) & (条件3) ] = 某个数/标签

一个实际小例子:有个4×4已经归一化(每个元素的数值范围在0-1之间)的二维数组,我希望:

  • (0,0.2] 范围内的数字,打上标签”1″;
  • (0.2, 0.4] 范围内的数字,打上标签”2″;
  • (0.4, 0.6] 范围内的数字,打上标签”3″;
  • (0.6, 0.8] 范围内的数字,打上标签”4″;
  • (0.8, 1] 范围内的数字,打上标签”5″。

看上去貌似要多次循环+判断,但其实用上面提到的numpy自带操作处理,简单快速!

import random
a = np.random.rand( 4, 4 )
# w = a   —— 这是浅拷贝!如果改了w,a就自动也改了!我们当然希望标签与原数据都保留!
w = a.copy()  # 这才是深拷贝!二者完全隔离!
# 满足多条件的赋值:多个条件之间,要加()和,彼此隔开!√
w[ (w > 0.2) & (w <= 0.4) ] = 2
w[ (w > 0.4) & (w <= 0.6) ] = 3
w[ (w > 0.6) & (w <= 0.8) ] = 4
w[ (w > 0.8) & (w <= 1.0) ] = 5
w[ w <= 0.2 ] = 1  # 这个1必须放最后,否则会和上面5的条件“范围”冲突!
# 结果:
a
Out[3]: 
array([[0.69080079, 0.37832965, 0.27004349, 0.79289527],
       [0.28036247, 0.11518823, 0.64604617, 0.42053893],
       [0.3990824 , 0.33475105, 0.81398231, 0.87659321],
       [0.56209747, 0.71875602, 0.76563738, 0.32211932]])
w
Out[4]: 
array([[4., 2., 2., 4.],
       [2., 1., 4., 3.],
       [2., 2., 5., 5.],
       [3., 4., 4., 2.]])

如程序中已经注明了的,有两点需要注意:

  • 标签w已经要对原始数据进行”深拷贝“!否则该了标签,就相应一起该了原数据!
  • w[ w <= 0.2 ] = 1 这个操作一定要放到最后!否则它若在最前面,所有小于0.2的数据都先被转为1,但是第五个条件是(0.8,1]的数据都转为5!此时条件五把标签”1″给转成了5!!!

https://www.jianshu.com/p/e097abcbe2d5

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论