Python 带Numpy-ndarray的条件索引

Python 带Numpy-ndarray的条件索引,python,numpy,matrix,indexing,Python,Numpy,Matrix,Indexing,我有一个浮点值的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) 假设我想从矩阵中选择行,其中第一列的值在1到6之间,第二列的值在2到7之间 在满足这些条件的情况下,

我有一个浮点值的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)
假设我想从矩阵中选择行,其中第一列的值在1到6之间,第二列的值在2到7之间

在满足这些条件的情况下,如何获得矩阵的行索引?如果要删除满足条件条件条件的行,该怎么办

获取行索引:

row_indices = [x for x in range(4) if matrix[x][0] in range(1,7) and matrix[x][1] in range(2,8)]
删除行:

indices = [x for x in range(4) if not( matrix[x][0] in range(1,7) and matrix[x][1] in range(2,8))]

new_matrix = matrix[indices]

您可以通过以下方式获得索引:

rows = np.logical_and(0 < matrix[:, 0], < matrix[:, 0] < 6 ) *  np.logical_and(1 < matrix[:, 1], matrix[:, 1] < 7)
rows=np.logical_和(0

然后
newMatrix=np.delete(matrix,rows,axis=0)

对于基于numpy的解决方案,您可以使用并从中获取行索引,然后使用它为您的矩阵编制索引。范例-

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

matrix[mask,:]

matrix[np.where((1你提到了MATLAB。这里是使用八度音阶得到的公认答案的等价物

octave:17> ma=reshape(1:20,5,4)
ma =
    1    6   11   16
    2    7   12   17
    3    8   13   18
    4    9   14   19
    5   10   15   20

octave:18> mask=(1<=ma(1,:))&(ma(1,:)<=6)&(2<=ma(2,:))&(ma(2,:)<=7)
mask =
   1   1   0   0

octave:19> ma(:,mask)
ans =
    1    6
    2    7
    3    8
    4    9
    5   10
我在倍频程版本中切换了行和列,因为这是生成相同数字的自然方式(MATLAB/Octave使用的是
numpy
s'F'顺序的等价物-见下文)

其他更改是0 v 1开始索引和()v[]

在numpy中生成
矩阵
的更简单方法:

In [594]: np.arange(1,21).reshape(4,5)
Out[594]: 
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10],
       [11, 12, 13, 14, 15],
       [16, 17, 18, 19, 20]])
或者使用MATLAB布局:

In [595]: np.arange(1,21).reshape(5,4,order='F')
Out[595]: 
array([[ 1,  6, 11, 16],
       [ 2,  7, 12, 17],
       [ 3,  8, 13, 18],
       [ 4,  9, 14, 19],
       [ 5, 10, 15, 20]])

非常感谢!=)非常感谢“范围(1,7)”部分看起来非常低效可能还有一个更优雅的使用numpy的方法。where()…仍在考虑。非常感谢!我习惯于更多地了解Matlab的索引,所以Python的索引有时会让我困惑;DGlad I可能会有所帮助!:-)。如果您觉得答案有帮助,我希望您通过单击答案左侧的勾号来接受答案(以您认为最好的为准),这将对社区有所帮助。您可以省略
where
,只需使用布尔掩码来选择行。
掩码=(1@hpaulj很好的建议,谢谢。我已经把它包括在了答案中。谢谢,太好了!还有,你忘了在第二行加上“行”吗?非常感谢!=)太好了!
In [592]: mask=(1 <= matrix[:,0]) & (matrix[:,0] <= 6) &(2 <= matrix[:,1]) & (matrix[:,1] <= 7)

In [593]: matrix[mask,:]
Out[593]: 
array([[  1.,   2.,   3.,   4.,   5.],
       [  6.,   7.,   8.,   9.,  10.]])
In [594]: np.arange(1,21).reshape(4,5)
Out[594]: 
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10],
       [11, 12, 13, 14, 15],
       [16, 17, 18, 19, 20]])
In [595]: np.arange(1,21).reshape(5,4,order='F')
Out[595]: 
array([[ 1,  6, 11, 16],
       [ 2,  7, 12, 17],
       [ 3,  8, 13, 18],
       [ 4,  9, 14, 19],
       [ 5, 10, 15, 20]])