使用Numpy ndarray进行条件索引

jje*_*omi 6 python indexing numpy matrix

我有一个浮动值的Numpy ndarray矩阵,我需要选择特定行,其中某些列的值满足某些条件.例如,假设我有以下numpy矩阵:

matrix = np.ndarray([4, 5])
matrix[0,:] = range(1,6)
matrix[1,:] = range(6,11)
matrix[2,:] = range(11,16)
matrix[3,:] = range(16,21)
Run Code Online (Sandbox Code Playgroud)

假设我想从矩阵中选择第一列值在1到6之间的行,第二列的值在2-7之间.

如何获得满足这些条件的矩阵的行索引?如果我想删除满足条件标准的行呢?

Ana*_*mar 10

对于基于numpy的解决方案,您可以使用numpy.where然后从中获取行索引,然后使用它来索引矩阵.示例 -

matrix[np.where((1 <= matrix[:,0]) & (matrix[:,0] <= 6)
       & (2 <= matrix[:,1]) & (matrix[:,1] <= 7))]
Run Code Online (Sandbox Code Playgroud)

演示 -

In [169]: matrix
Out[169]:
array([[  1.,   2.,   3.,   4.,   5.],
       [  6.,   7.,   8.,   9.,  10.],
       [ 11.,  12.,  13.,  14.,  15.],
       [ 16.,  17.,  18.,  19.,  20.]])

In [170]: matrix[np.where((1 <= matrix[:,0]) & (matrix[:,0] <= 6)
   .....:        & (2 <= matrix[:,1]) & (matrix[:,1] <= 7))]
Out[170]:
array([[  1.,   2.,   3.,   4.,   5.],
       [  6.,   7.,   8.,   9.,  10.]])
Run Code Online (Sandbox Code Playgroud)

另一种方法,如注释中所示,将使用布尔掩码,示例 -

mask = ((1 <= matrix[:,0]) & (matrix[:,0] <= 6)
           & (2 <= matrix[:,1]) & (matrix[:,1] <= 7))

matrix[mask,:]
Run Code Online (Sandbox Code Playgroud)

演示 -

In [41]: matrix
Out[41]:
array([[  1.,   2.,   3.,   4.,   5.],
       [  6.,   7.,   8.,   9.,  10.],
       [ 11.,  12.,  13.,  14.,  15.],
       [ 16.,  17.,  18.,  19.,  20.]])

In [42]: mask = ((1 <= matrix[:,0]) & (matrix[:,0] <= 6)
   ....:            & (2 <= matrix[:,1]) & (matrix[:,1] <= 7))

In [43]:

In [43]: matrix[mask,:]
Out[43]:
array([[  1.,   2.,   3.,   4.,   5.],
       [  6.,   7.,   8.,   9.,  10.]])
Run Code Online (Sandbox Code Playgroud)