2017-09-26 39 views
1

上那些三維numpy的陣列我有2個numpy的陣列outputindex裝滿基於2D陣列具有索引

output = np.zeros((3,3,3)) 

>>>index 
array([[0,1,2], 
     [1,0,0], 
     [2,2,2]]) 

index表示直到其output應與那些在第一維填入的索引。的output的填充值應該是這樣的:

>>>output 
array([[[1, 1, 1], 
     [1, 1, 1], 
     [1, 1, 1]], 
     [[0, 1, 1], 
     [1, 0, 0], 
     [1, 1, 1]], 
     [[0, 0, 1], 
     [0, 0, 0], 
     [1, 1, 1]]] 

例如,由於index[0, 1] == 1,我們設置output[:1+1, 0, 1] = 1。一般來說,如果index[i, j] == k,我們設置output[:k+1, i, j] = 1

有誰知道如何以矢量化的方式實現這一點?

回答

2

使用NumPy broadcasting,我們可以創建這些地方的面具。所以,簡單地認爲蒙版轉換成0s1s一個int數組,像這樣 -

(index >= np.arange(3)[:,None,None]).astype(int) 

採樣運行 -

In [471]: index 
Out[471]: 
array([[0, 1, 2], 
     [1, 0, 0], 
     [2, 2, 2]]) 

In [472]: (index >= np.arange(3)[:,None,None]).astype(int) 
Out[472]: 
array([[[1, 1, 1], 
     [1, 1, 1], 
     [1, 1, 1]], 

     [[0, 1, 1], 
     [1, 0, 0], 
     [1, 1, 1]], 

     [[0, 0, 1], 
     [0, 0, 0], 
     [1, 1, 1]]]) 

另外,分配到output,使用面膜的boolean-indexing和分配1s -

output[index >= np.arange(output.shape[0])[:,None,None]] = 1 
0

您可以分配1到最後一個位置(沿第一維),然後回來1使用np.maximum.accumulate填0:

output[index, np.arange(output.shape[1])[:,None], np.arange(output.shape[2])] = 1 
np.maximum.accumulate(output[::-1], axis=0)[::-1] 

#array([[[ 1., 1., 1.], 
#  [ 1., 1., 1.], 
#  [ 1., 1., 1.]], 

#  [[ 0., 1., 1.], 
#  [ 1., 0., 0.], 
#  [ 1., 1., 1.]], 

#  [[ 0., 0., 1.], 
#  [ 0., 0., 0.], 
#  [ 1., 1., 1.]]])