【问题标题】:Return numpy matrix without specific row返回没有特定行的numpy矩阵
【发布时间】:2019-08-10 14:27:21
【问题描述】:

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

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

【问题讨论】:

  • 为什么np.array_equal不够好?
  • 我很好奇是否有'numpy方式'来做到这一点。无需使用 for 遍历整个矩阵。
  • 所以你想要没有匹配test_row的行的数组?这样的行可能不止一个吗?您想要完全匹配吗?

标签: python numpy


【解决方案1】:

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

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

【讨论】:

【解决方案2】:
In [318]: arr = np.arange(24).reshape(8,3)                                                
In [319]: test = np.array([6,7,8])                                                        

两者之间的全数组比较:

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)

【讨论】:

    猜你喜欢
    • 2018-10-20
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 2022-01-23
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多