详解Python中where()函数的用法
where()的用法
首先强调一下,where()函数对于不同的输入,返回的只是不同的。
1当数组是一维数组时,返回的值是一维的索引,所以只有一组索引数组
2当数组是二维数组时,满足条件的数组值返回的是值的位置索引,因此会有两组索引数组来表示值的位置
例如
>>>b=np.arange(10) >>>b array([0,1,2,3,4,5,6,7,8,9]) >>>np.where(b>5) (array([6,7,8,9],dtype=int64),) >>>a=np.reshape(np.arange(20),(4,5)) >>>a array([[0,1,2,3,4], [5,6,7,8,9], [10,11,12,13,14], [15,16,17,18,19]]) >>>np.where(a>10) (array([2,2,2,2,3,3,3,3,3],dtype=int64), array([1,2,3,4,0,1,2,3,4],dtype=int64))
对numpy标准库里的解释做一个介绍:
numpy.where(condition[,x,y])
基于条件condition,返回值来自x或者y.
如果.
condition :数组,bool值 WhenTrue,yield x,otherwiseyield y. x,y :array_like,可选 x与y的shape要相同,当condition中的值是true时返回x对应位置的值,false是返回y的 out :ndarrayortupleofndarrays ①如果参数有condition,x和y,它们三个参数的shape是相同的。那么,当condition中的值是true时返回x对应位置的值,false是返回y的。 ②如果参数只有condition的话,返回值是condition中元素值为true的位置索引,切是以元组形式返回,元组的元素是ndarray数组,表示位置的索引
参数:
返回值:
>>>np.where([[True,False],[True,True]], ...[[1,2],[3,4]], ...[[9,8],[7,6]]) array([[1,8], [3,4]]) >>> >>>np.where([[0,1],[1,0]]) (array([0,1]),array([1,0])) >>> >>>x=np.arange(9.).reshape(3,3) >>>np.where(x>5) (array([2,2,2]),array([0,1,2])) >>>x[np.where(x>3.0)]#Note:resultis1D. array([4.,5.,6.,7.,8.]) >>>np.where(x<5,x,-1)#Note:broadcasting. array([[0.,1.,2.], [3.,4.,-1.], [-1.,-1.,-1.]]) Findtheindicesofelementsofxthatareingoodvalues. >>> >>>goodvalues=[3,4,7] >>>ix=np.in1d(x.ravel(),goodvalues).reshape(x.shape) >>>ix array([[False,False,False], [True,True,False], [False,True,False]],dtype=bool) >>>np.where(ix) (array([1,1,2]),array([0,1,1]))
两种方法的示例代码
第一种用法
np.where(conditions,x,y)
if(condituons成立):
数组变x
else:
数组变y
importnumpyasnp ''' x=np.random.randn(4,4) print(np.where(x>0,2,-2)) #试试效果 xarr=np.array([1.1,1.2,1.3,1.4,1.5]) yarr=np.array([2.1,2.2,2.3,2.4,2.5]) zarr=np.array([True,False,True,True,False]) result=[(xifcelsey) forx,y,cinzip(xarr,yarr,zarr)] print(result) #where()函数处理就相当于上面那种方案 result=np.where(zarr,xarr,yarr) print(result) ''' #发现个有趣的东西 ##处理2组数组 ##TrueandTrue=0 ##TrueandFalse=1 ##FalseandTrue=2 ##FalseandFalse=3 cond2=np.array([True,False,True,False]) cond1=np.array([True,True,False,False]) #第一种处理太长太丑 result=[] foriinrange(4): if(cond1[i]&cond2[i]):result.append(0); elif(cond1[i]):result.append(1); elif(cond2[i]):result.append(2); else:result.append(3); print(result) #第二种直接where()很快很方便 result=np.where(cond1&cond2,0,np.where(cond1,1,np.where(cond2,2,3))) print(result) #第三种更简便(好像这跟where()函数半毛钱的关系都没有 result=1*(cond1&-cond2)+2*(cond2&-cond1)+3*(-(cond1|cond2))(没想到还可以这么表达吧) print(result)
第二种用法
where(conditions)
相当于给出数组的下标
x=np.arange(16) print(x[np.where(x>5)]) #输出:(array([6,7,8,9,10,11,12,13,14,15],dtype=int64),) x=np.arange(16).reshape(-1,4) print(np.where(x>5)) #(array([1,1,2,2,2,2,3,3,3,3],dtype=int64),array([2,3,0,1,2,3,0,1,2,3],dtype=int64)) #注意这里是坐标是前面的一维的坐标,后面是二维的坐标
ix=np.array([[False,False,False], [True,True,False], [False,True,False]],dtype=bool) print(np.where(ix)) #输出:(array([1,1,2],dtype=int64),array([0,1,1],dtype=int64))
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。