2015-07-05 23 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