2015-07-05 29 views
1

假设我们有一个矩阵:从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.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]) 

我想知道的是我们如何使用索引从矩阵中排除元素,即如何获得t他下面的结果:

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(),但这似乎也没有做到这一点。任何不需要循环或列表解析的解决方案?希望有任何见解。谢谢。

编辑:数据必须在相同的列后处理。

回答

1

当你说'删除'不起作用时,你是什么意思?它有什么作用?这可能是诊断。

让我们在那做的工作选择先看看:

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))]不起作用,因为负指数已经有意义 - count from the end

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

这种类型的索引/删除作品。当然,在这种情况下,你不能指望将矩阵重塑成矩形矩阵。

通常,在处理不同行的不同索引时,操作最终将作用于矩阵的平坦或散乱版本。处理1d数组比使用2d时,“不规则”操作通常更有意义。


仔细看看您的示例,我发现当您移除某个项目时,将其他列值向上移动以填补空白。在我的版本中,我沿着行移动了值。让我们试一试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]]) 

其中I除去从各列的值:

In [525]: mat2[idx2] 
Out[525]: array([ 0, 21, 17, 8, 19]) 
+0

好像当OPS是在扁平的数据执行不保留数据的列完整性。 – user97979717

+0

我正在寻找一种方法来放大,删除元素下的所有东西。对困惑感到抱歉。 – user97979717

+0

通过'F'重新排序和转置,'np.delete'可以将值保存在列中(与我例子中的行相反)。 – hpaulj