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

R.j*_*joe 1 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)`
Run Code Online (Sandbox Code Playgroud)

hpa*_*ulj 7

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])
Run Code Online (Sandbox Code Playgroud)

分别有2个条件:

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])
Run Code Online (Sandbox Code Playgroud)

用逻辑或将它们连接起来:

In [35]: (a<4) | (a>10)                                                         
Out[35]: array([ True,  True,  True, False, False,  True,  True])
Run Code Online (Sandbox Code Playgroud)

where是一个元组(大小为 1,因为有 1 个维度):

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

该元组可以直接用于索引a

In [37]: a[_]                                                                   
Out[37]: array([ 1,  2,  3, 12, 13])
Run Code Online (Sandbox Code Playgroud)

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

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

它可能更容易可视化,但对于索引来说不太有用(除非您迭代地执行)。

使用逻辑与,结果是空索引 - 没有值满足这两个条件:

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