删除numpy数组中的行和列

7

假设我有这样一个数组:

x = [1, 2, 3]
    [4, 5, 6]
    [7, 8, 9]

我希望删除第i行和第i列。如果i=1,则创建以下矩阵(使用0-indexing):

[1, 3]
[7, 9]

有没有一种简单的方法可以用一行代码完成这个操作?我知道我可以调用 np.delete() 两次,但那看起来有点不干净。

等价于 np.delete(np.delete(x, idx, 0), idx, 1),其中 idx 是要删除的行/列对的索引 - 只是看起来更整洁。


您想要删除具有单个索引的行和列吗?还是分别删除它们? - Chris
最终,所有的删除操作都归结为选择特定的元素或行/列。您正在创建一个新数组,而不是更改原始数组。 - hpaulj
@Chris 理想情况下,我只需要使用一个索引。 - Alex L
什么规则告诉你要删除哪一行和哪一列?数组总是正方形的吗?你总是删除具有相同索引的行和列吗?这样做有什么作用? - Karl Knechtel
@KarlKnechtel 给定一个索引,删除那一行/列。矩阵始终是方形的。对于我的用例,我正在删除具有相同索引的行和列,但更一般的形式也可以。 我的用例有点复杂。本质上,我需要在保持新矩阵方形的同时提取特定的行/列对。我意识到 np.delete(np.delete(x, idx, 0), idx, 1) 是一种简单的解决方案,但我觉得应该有一种更清晰的方法。 - Alex L
2个回答

4
In [196]: x = np.arange(1,10).reshape(3,3)

如果您查看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])

因为您正在删除相同的行和列,所以请使用以下索引:

In [200]: x[mask,:][:,mask]
Out[200]: 
array([[1, 3],
       [7, 9]])

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

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

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

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

In [207]: np.ix_(mask,mask)
Out[207]: 
(array([[0],
        [2]]),
 array([[0, 2]]))

这不是一个单行代码,但它可能比双重的 delete 更快,因为它剥离了更通用函数所需的所有额外的负载。


3

这可以通过numpy的delete函数轻松实现。代码如下:

arr = np.delete(arr, index, 0) # deletes the desired row 
arr = np.delete(arr, index, 1) # deletes the desired column at index

第三个参数是axis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接