假设我有一个像这样的数组:
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 是要删除的行/列对的索引 - 它看起来更干净。
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,因为它消除了更通用的函数所需的所有额外包袱。
| 归档时间: |
|
| 查看次数: |
1704 次 |
| 最近记录: |