Python 带Numpy-ndarray的条件索引
我有一个浮点值的Numpy-ndarray矩阵,我需要选择特定的行,其中某些列的值满足某些条件。例如,假设我有以下numpy矩阵: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之间 在满足这些条件的情况下,
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]])