使用基于具有索引的2D数组的数组填充3D numpy数组

时间:2017-09-26 18:49:58

标签: python arrays numpy multidimensional-array indexing

我有2个numpy数组outputindex

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,我们会设置{{1}}。

有谁知道如何以矢量化方式实现这一目标?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以将1分配到最后一个位置(沿第一个维度),然后使用np.maximum.accumulate将0填充为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.]]])