2017-09-26 23 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.]]])