2015-10-16 72 views
2

我有一個浮點值的Numpy ndarray矩陣,我需要選擇特定行,其中某些列的值滿足某些條件。例如可以說我有以下numpy的矩陣:有條件的索引與Numpy ndarray

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之間。

如何獲得滿足這些條件的矩陣的行索引?如果我想刪除滿足條件標準的行,那怎麼辦?

回答

4

對於numpy的基於SOLU您可以使用numpy.where,然後從中獲取行索引,然後將其用於索引您的矩陣。實施例 -

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

演示 -

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.]]) 

的另一種方法,如在註釋指示是使用布爾掩碼,例如 -

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

matrix[mask,:] 

演示 -

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.]]) 
+0

非常感謝!我習慣使用Matlab的索引,所以Python的索引有時讓我困惑; D – jjepsuomi

+0

很高興我能幫上忙! :-)。如果您發現答案有幫助,我想要求您通過點擊答案左側的刻度線來接受答案(無論您認爲最好),這對社區會有幫助。 –

+0

確定x)thnx – jjepsuomi

0

獲取行索引:

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] 
+0

非常感謝您! =)欣賞它 – jjepsuomi

+0

「範圍內(1,7)」的部分看起來非常低效 –

+0

甚至可能有更優雅的方法使用numpy.where()...仍在思考它。 – corinna

1

你可以得到指數與:

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

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

+0

謝謝你,優秀!附:你忘了將'行'添加到第二行嗎? – jjepsuomi

+1

是的,我做到了。現在更正 –

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 

沒有where接受的答案是:

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.]]) 

我切換在Octave版本的行和列,因爲這是產生相同數量的其自然的方式(MATLAB/Octave使用相當於numpy的'F'順序 - 見下文)。

其他更改是0 v 1開始索引和()v []。否則這兩個符號是相似的。

更簡單的方法來產生numpy的的matrix

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]]) 
+0

非常感謝! =)優秀! – jjepsuomi