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
更快,因为它剥离了更通用函数所需的所有额外的负载。
np.delete(np.delete(x, idx, 0), idx, 1)
是一种简单的解决方案,但我觉得应该有一种更清晰的方法。 - Alex L