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,9],dtype=int64),) >>>a=np.reshape(np.arange(20),(4,5)) >>>a array([[ 0,4],[ 5,[10,11,12,13,14],[15,16,17,18,19]]) >>>np.where(a>10) (array([2,3],array([1,dtype=int64))
对numpy标准库里的解释做一个介绍:
numpy.where(condition[,x,y])
基于条件condition,返回值来自x或者y.
如果.
参数: |
condition : 数组,bool值 When True,yield x,otherwise yield y. x,y : array_like,可选 x与y的shape要相同,当condition中的值是true时返回x对应位置的值,false是返回y的 |
---|---|
返回值: |
out : ndarray or tuple of ndarrays ①如果参数有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,4]]) >>> >>> np.where([[0,1],[1,0]]) (array([0,1]),0])) >>> >>> x = np.arange(9.).reshape(3,3) >>> np.where( x > 5 ) (array([2,2]),array([0,2])) >>> x[np.where( x > 3.0 )] # Note: result is 1D. array([ 4.,5.,6.,7.,8.]) >>> np.where(x < 5,-1) # Note: broadcasting. array([[ 0.,1.,2.],[ 3.,4.,-1.],[-1.,-1.,-1.]]) Find the indices of elements of x that are in goodvalues. >>> >>> goodvalues = [3,7] >>> ix = np.in1d(x.ravel(),goodvalues).reshape(x.shape) >>> ix array([[False,False,[ True,True,[False,False]],dtype=bool) >>> np.where(ix) (array([1,1]))
第一种用法
np.where(conditions,y)
if (condituons成立):
数组变x
else:
数组变y
import numpy as np ''' x = np.random.randn(4,4) print(np.where(x>0,-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]) result = [(x if c else y) for x,y,c in zip(xarr,yarr,zarr)] print(result) #where()函数处理就相当于上面那种方案 result = np.where(zarr,xarr,yarr) print(result) ''' #发现个有趣的东西 # #处理2组数组 # #True and True = 0 # #True and False = 1 # #False and True = 2 # #False and False = 3 cond2 = np.array([True,False]) cond1 = np.array([True,False]) #第一种处理 太长太丑 result = [] for i in range(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,np.where(cond1,np.where(cond2,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,9,10,14,15],) x = np.arange(16).reshape(-1,4) print(np.where(x>5)) #(array([1,array([2,dtype=int64)) #注意这里是坐标是前面的一维的坐标,后面是二维的坐标
ix = np.array([[False,dtype=bool) print(np.where(ix)) #输出:(array([1,dtype=int64))
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。