返回没有特定行的numpy矩阵

时间:2019-03-19 23:42:38

标签: python numpy

我有一个矩阵[n x 3]。我要指定行:
test_row = np.array([a, b, c])
并将其从我的矩阵中删除。

是否有比在整个矩阵上使用for和np.array_equal更好的方法?

2 个答案:

答案 0 :(得分:0)

删除所需行的另一种方法是,如果您碰巧知道要删除的行的索引,则可以简单地对剩余的行进行切片并将其连接成矩阵,如下所示:下面的示例:

In [8]: arr = np.arange(5*3).reshape(5, 3)

In [9]: arr
Out[9]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11],
       [12, 13, 14]])

In [10]: remove_row_idx = 2

In [11]: np.vstack((arr[:remove_row_idx, :], arr[remove_row_idx+1:,]))
Out[11]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 9, 10, 11],
       [12, 13, 14]])

答案 1 :(得分:0)

In [318]: arr = np.arange(24).reshape(8,3)                                                
In [319]: test = np.array([6,7,8])                                                        

2:之间的全数组比较

In [322]: np.isin(arr,test)                                                               
Out[322]: 
array([[False, False, False],
       [False, False, False],
       [ True,  True,  True],
       [False, False, False],
       [False, False, False],
       [False, False, False],
       [False, False, False],
       [False, False, False]])

找到所有词语均匹配的行:

In [323]: np.isin(arr,test).all(axis=1)                                                   
Out[323]: array([False, False,  True, False, False, False, False, False])

使用其倒数作为掩码来选择守护者行:

In [324]: arr[~_]                                                                         
Out[324]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 9, 10, 11],
       [12, 13, 14],
       [15, 16, 17],
       [18, 19, 20],
       [21, 22, 23]])

isin实际上是in1d加上重塑:

In [327]: np.in1d(arr,test)                                                               
Out[327]: 
array([False, False, False, False, False, False,  True,  True,  True,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False])
In [328]: np.in1d(arr,test).reshape(arr.shape)                                            
Out[328]: 
array([[False, False, False],
       [False, False, False],
       [ True,  True,  True],
       [False, False, False],
       [False, False, False],
       [False, False, False],
       [False, False, False],
       [False, False, False]])

此广播比较也适用:

(arr[:,None,:]==test[None,:,None]).any(axis=1).all(axis=1)