删除numpy数组中的行和列

Ale*_*x L 7 python numpy

假设我有一个像这样的数组:

x = [1, 2, 3]
    [4, 5, 6]
    [7, 8, 9]
Run Code Online (Sandbox Code Playgroud)

我想删除第 i 行和第 i 列。因此,如果 i=1,我将创建(使用 0 索引):

[1, 3]
[7, 9]
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以用单行代码做到这一点?我知道我可以打电话np.delete()两次,但这似乎有点不干净。

它完全等同于np.delete(np.delete(x, idx, 0), idx, 1),其中 idx 是要删除的行/列对的索引 - 它看起来更干净。

hpa*_*ulj 4

In [196]: x = np.arange(1,10).reshape(3,3)
Run Code Online (Sandbox Code Playgroud)

如果您查看np.delete代码,您会发现它是 python(未编译),并且根据删除值的指定方式采用不同的方法。一种是创建一个res大小合适的数组,并将两个切片复制到其中。

另一种是制作布尔掩码。例如:

In [197]: mask = np.ones(x.shape[0], bool)
In [198]: mask[1] = 0
In [199]: mask
Out[199]: array([ True, False,  True])
Run Code Online (Sandbox Code Playgroud)

由于您要删除相同的行和列,因此请使用以下索引:

In [200]: x[mask,:][:,mask]
Out[200]: 
array([[1, 3],
       [7, 9]])
Run Code Online (Sandbox Code Playgroud)

像这样的一维布尔掩码不能像整数数组那样“广播”。

我们可以使用以下方法进行二维高级索引:

In [201]: idx = np.nonzero(mask)[0]
In [202]: idx
Out[202]: array([0, 2])
In [203]: np.ix_(idx,idx)
Out[203]: 
(array([[0],
        [2]]),
 array([[0, 2]]))
In [204]: x[np.ix_(idx,idx)]
Out[204]: 
array([[1, 3],
       [7, 9]])
Run Code Online (Sandbox Code Playgroud)

实际上ix_可以直接从布尔数组工作:

In [207]: np.ix_(mask,mask)
Out[207]: 
(array([[0],
        [2]]),
 array([[0, 2]]))
Run Code Online (Sandbox Code Playgroud)

这不是单行代码,但它可能比 double 更快delete,因为它消除了更通用的函数所需的所有额外包袱。