Python 如何从numpy矩阵中排除元素
假设我们有一个矩阵:Python 如何从numpy矩阵中排除元素,python,numpy,Python,Numpy,假设我们有一个矩阵: mat = np.random.randn(5,5) array([[-1.3979852 , -0.37711369, -1.99509723, -0.6151796 , -0.78780951], [ 0.12491113, 0.90526669, -0.18217331, 1.1252506 , -0.31782889], [-3.5933008 , -0.17981343, 0.91469733, -0.59719805, 0.
mat = np.random.randn(5,5)
array([[-1.3979852 , -0.37711369, -1.99509723, -0.6151796 , -0.78780951],
[ 0.12491113, 0.90526669, -0.18217331, 1.1252506 , -0.31782889],
[-3.5933008 , -0.17981343, 0.91469733, -0.59719805, 0.12728085],
[ 0.6906646 , 0.2316733 , -0.2804641 , 1.39864598, -0.09113139],
[-0.38012856, -1.7230821 , -0.5779237 , 0.30610451, -1.30015299]])
还假设我们有一个索引数组:
idx = np.array([0,4,3,1,3])
我们可以使用以下方法从矩阵中提取元素:
mat[idx, range(len(idx))]
array([-1.3979852 , -1.7230821 , -0.2804641 , 1.1252506 , -0.09113139])
我想知道的是如何使用索引从矩阵中排除元素,即如何获得以下结果:
array([[0.12491113 , -0.37711369, -1.99509723, -0.6151796 , -0.78780951],
[-3.5933008 , 0.90526669, -0.18217331, -0.59719805, -0.31782889],
[0.6906646 , -0.17981343, 0.91469733, 1.39864598, 0.12728085],
[-0.38012856, 0.2316733 , -0.5779237 , 0.30610451, -1.30015299]])
本以为这就像做mat[-idx,range(len(idx))]
一样简单,但这不起作用。我也试过np.delete()
,但似乎也不行。有没有不需要循环或列表理解的解决方案?如果您有任何见解,我将不胜感激。谢谢
编辑:数据在处理后必须在同一列中。当你说“删除”不起作用时,你是什么意思?它有什么作用?这可能是诊断性的 让我们首先看一下有效的选择:
In [484]: mat=np.arange(25).reshape(5,5) # I like this better than random
In [485]: mat[idx,range(5)]
Out[485]: array([ 0, 21, 17, 8, 19])
这也可用于文件的展开版本:
In [486]: mat.flat[idx*5+np.arange(5)]
Out[486]: array([ 0, 21, 17, 8, 19])
现在,使用默认平面delete
尝试相同的操作:
In [487]: np.delete(mat,idx*5+np.arange(5)).reshape(5,4)
Out[487]:
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 9],
[10, 11, 12, 13],
[14, 15, 16, 18],
[20, 22, 23, 24]])
delete
不是就地运算符;它返回一个新的矩阵。如果指定一个轴,delete
将删除整行或整列,而不是选定的项目
mat[-idx,range(len(idx))]
不起作用,因为负索引已经有了意义-从末尾开始计数
此delete
最终执行布尔索引,因此:
In [498]: mat1=mat.ravel()
In [499]: idx1=idx*5+np.arange(5)
In [500]: ii=np.ones(mat1.shape, bool)
In [501]: ii[idx1]=False
In [502]: mat1[ii]
Out[502]:
array([ 1, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24])
即使您从每行中删除不同数量的项,这种索引/删除也可以工作。当然,在这种情况下,您不能指望将矩阵重塑为矩形矩阵
通常,在处理不同行的不同索引时,操作最终会作用于矩阵的展开版或展开版。”在处理一维数组时,“不规则”操作通常比处理二维数组更有意义
更仔细地看一下您的示例,我发现当您删除一个项时,您会向上移动其他列值以填补空白。在我的版本中,我沿行移动值。让我们用F来试试这个
In [523]: mat2=mat.flatten('F')
In [524]: np.delete(mat2,idx2).reshape(5,4).T
Out[524]:
array([[ 5, 1, 2, 3, 4],
[10, 6, 7, 13, 9],
[15, 11, 12, 18, 14],
[20, 16, 22, 23, 24]])
其中,我从每列中删除了一个值:
In [525]: mat2[idx2]
Out[525]: array([ 0, 21, 17, 8, 19])
当对扁平化的数据执行ops时,数据的列完整性似乎没有得到保留。我正在寻找一种向上移动的方法,即删除元素下面的所有内容。很抱歉造成混淆。使用
F
重新排序和转置,np.delete
可以将值保留在列中(与我的示例中的行相反)。我不想插嘴,但IDE在[525]中生成的是什么:输入[525]:输出[525]我已经花了很多时间试图找到这样做的交互式窗口…设置sys.ps1和sys.ps2并不能在windows上实现。