numpy.where (condition[, x, y])
1. np.where(condition, x, y)
满足条件(condition),输出x,不满足输出y。
如果是一维数组,相当于[xv if c else yv for (c,xv,yv) in zip(condition,x,y)]
1
2
3
4
5
6
7
8
9
10
11
|
>>> aa = np.arange( 10 ) >>> np.where(aa, 1 , - 1 ) array([ - 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ]) # 0为False,所以第一个输出-1 >>> np.where(aa > 5 , 1 , - 1 ) array([ - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , 1 , 1 , 1 , 1 ]) >>> np.where([[ True , False ], [ True , True ]], # 官网上的例子 [[ 1 , 2 ], [ 3 , 4 ]], [[ 9 , 8 ], [ 7 , 6 ]]) array([[ 1 , 8 ], [ 3 , 4 ]]) |
上面这个例子的条件为[[True,False], [True,False]],分别对应最后输出结果的四个值。第一个值从[1,9]中选,因为条件为True,所以是选1。第二个值从[2,8]中选,因为条件为False,所以选8,后面以此类推。类似的问题可以再看个例子:
1
2
3
4
5
6
7
|
>>> a = 10 >>> np.where([[a > 5 ,a < 5 ], [a = = 10 ,a = = 7 ]], [[ "chosen" , "not chosen" ], [ "chosen" , "not chosen" ]], [[ "not chosen" , "chosen" ], [ "not chosen" , "chosen" ]]) array([[ 'chosen' , 'chosen' ], [ 'chosen' , 'chosen' ]], dtype = '<U10' ) |
2. np.where(condition)
只有条件 (condition),没有x和y,则输出满足条件 (即非0) 元素的坐标 (等价于numpy.nonzero)。这里的坐标以tuple的形式给出,通常原数组有多少维,输出的tuple中就包含几个数组,分别对应符合条件元素的各维坐标。
1
2
3
4
5
6
7
8
|
>>> a = np.array([ 2 , 4 , 6 , 8 , 10 ]) >>> np.where(a > 5 ) # 返回索引 (array([ 2 , 3 , 4 ]),) >>> a[np.where(a > 5 )] # 等价于 a[a>5] array([ 6 , 8 , 10 ]) >>> np.where([[ 0 , 1 ], [ 1 , 0 ]]) (array([ 0 , 1 ]), array([ 1 , 0 ])) |
上面这个例子条件中[[0,1],[1,0]]的真值为两个1,各自的第一维坐标为[0,1],第二维坐标为[1,0] 。
下面看个复杂点的例子:
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
26
27
28
29
30
|
>>> a = np.arange( 27 ).reshape( 3 , 3 , 3 ) >>> a array([[[ 0 , 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 , 26 ]]]) >>> np.where(a > 5 ) (array([ 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ]), array([ 2 , 2 , 2 , 0 , 0 , 0 , 1 , 1 , 1 , 2 , 2 , 2 , 0 , 0 , 0 , 1 , 1 , 1 , 2 , 2 , 2 ]), array([ 0 , 1 , 2 , 0 , 1 , 2 , 0 , 1 , 2 , 0 , 1 , 2 , 0 , 1 , 2 , 0 , 1 , 2 , 0 , 1 , 2 ])) # 符合条件的元素为 [ 6 , 7 , 8 ]], [[ 9 , 10 , 11 ], [ 12 , 13 , 14 ], [ 15 , 16 , 17 ]], [[ 18 , 19 , 20 ], [ 21 , 22 , 23 ], [ 24 , 25 , 26 ]]] |
所以np.where会输出每个元素的对应的坐标,因为原数组有三维,所以tuple中有三个数组。
1、numpy.where的返回结果
numpy.where调用方式为numpy.where(condition,1,2)
满足条件的位置上返回结果1,不满足的位置上返回结果2
例如通过where()函数将a数组中负值设为0,正值不变
如果没有指定返回结果,只有查找条件则返回满足条件的位置。返回的结果是一个元组(tuple),包含两个数组,第一个数组纪录的是行,第二个数组纪录的是列。
可以使用zip函数将返回的位置组成一个个坐标对,方便调用。zip函数直接返回的是一个对象,可以用过for循环遍历出里面的元素,也可以使用list直接列出所有坐标对元素。
2、numpy.where多条件查询
与: numpy.where((con1)*(con2))或者用&
或:numpy.where((con1)|(con2)) (重点:多条件查询时条件一定要用括号!一定要用括号!一定要用括号!)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/massquantity/p/8908859.html