2012-09-15 82 views
7

給定一個2D numpy數組,例如:使用布爾索引就地修改numpy數組部分

import numpy as np 

data = np.array([ 
    [11,12,13], 
    [21,22,23], 
    [31,32,33], 
    [41,42,43],   
    ]) 

我需要代替修改基於針對所期望的行和列中的兩個掩蔽向量的子陣列;

rows = np.array([False, False, True, True], dtype=bool) 
cols = np.array([True, True, False], dtype=bool) 

這樣即:即:

print data 

#[[11,12,13], 
# [21,22,23], 
# [0,0,33], 
# [0,0,43]]  

回答

5

Now你知道如何訪問所需的行/ COLS,只是assigne你的子陣列所需的值。這是一點點麻煩,但:

mask = rows[:,None]*cols[None,:] 
data[mask] = 0 

的原因是,當我們訪問子陣列作爲data[rows][:,cols](在你previous question所示,我們採取一個視點的視點,並以原始數據提供一些參考獲取迷失在路上。

相反,在這裏,我們通過廣播你的兩個一維數組rowscols一個與其他構造一個2D布爾數組。現在你mask陣列具有形狀(len(rows),len(cols)。我們可以使用mask直接訪問原始項目data,我們將它們設置爲一個新值。當你做data[mask]時,你會得到一個1D數組,這不是你想要的previous question的答案。

構建面具,我們可以用來代替*&操作(因爲我們正在與布爾數組處理),或者更簡單的np.outer功能:

mask = np.outer(rows,cols) 

編輯:道具@Marcus瓊斯爲np.outer解決方案。

+1

這個工作,但如何「掩膜= np.outer(行,列)」? –

+1

有沒有辦法從布爾索引獲取視圖?上面的作品只是因爲numpy對待不同的分配。 'data [mask]'仍然不是一個視圖。 –