如何在多个条件下使用np.arwhere?

时间:2019-02-23 05:06:26

标签: python numpy numpy-ndarray

我想用np.argwhere或np.where来选择1、2、3、12和13的索引。在两种情况下,以下代码都无法正常工作。有什么方法可以使用这两个命令来执行此操作,还是应该使用它两次而不是使用&运算符?

`a= np.array([1,2,3,4,10,12,13])
b = np.argwhere((a<4) & (a>10))
c = np.where((a<4) & (a>10))
print(b)
print(c)`

2 个答案:

答案 0 :(得分:1)

In [31]: a= np.array([1,2,3,4,10,12,13])                                        
In [32]: a                                                                      
Out[32]: array([ 1,  2,  3,  4, 10, 12, 13])

分别满足以下两个条件:

In [33]: a<4                                                                    
Out[33]: array([ True,  True,  True, False, False, False, False])
In [34]: a>10                                                                   
Out[34]: array([False, False, False, False, False,  True,  True])

使用逻辑或加入他们

In [35]: (a<4) | (a>10)                                                         
Out[35]: array([ True,  True,  True, False, False,  True,  True])

where是一个元组(尺寸为1,因为尺寸为1):

In [36]: np.where((a<4) | (a>10))                                               
Out[36]: (array([0, 1, 2, 5, 6]),)

该元组可直接用于索引a

In [37]: a[_]                                                                   
Out[37]: array([ 1,  2,  3, 12, 13])

argwhere给出相同的索引,但采用“垂直”格式:

In [38]: np.argwhere((a<4) | (a>10))                                            
Out[38]: 
array([[0],
       [1],
       [2],
       [5],
       [6]])

它可能更容易可视化,但对于索引编制却不是那么有用(除非您反复进行)。

使用逻辑和,结果为空索引-没有值同时满足两个条件:

In [39]: np.where((a<4) & (a>10))                                               
Out[39]: (array([], dtype=int64),)

答案 1 :(得分:0)

您可以使用np.where

c = np.where((a < 4) & (a > 10),a, a)
c
array([ 1,  2,  3,  4, 10, 12, 13])