Python Numpy使用2D数组作为3D数组的类似高度贴图的索引

Python Numpy使用2D数组作为3D数组的类似高度贴图的索引,python,arrays,numpy,indexing,heightmap,Python,Arrays,Numpy,Indexing,Heightmap,我想使用二维阵列作为三维阵列的索引,并将其作为指向三维阵列的索引轴0的高度贴图。有没有一种有效的方法可以做到这一点?在我的示例中,我想将每个对应的支柱二零中的所有高度都设置为等于或大于heightmap的高度。例子: 3D阵列: [[[1, 1, 1], [1, 1, 1], [1, 1, 1]], [[1, 1, 1], [1, 1, 1], [1, 1, 1]], [[1, 1, 1], [1, 1, 1], [1, 1, 1]], [[1, 1, 1],

我想使用二维阵列作为三维阵列的索引,并将其作为指向三维阵列的索引轴0的高度贴图。有没有一种有效的方法可以做到这一点?在我的示例中,我想将每个对应的支柱二零中的所有高度都设置为等于或大于heightmap的高度。例子: 3D阵列:

[[[1, 1, 1],
  [1, 1, 1],
  [1, 1, 1]],
 [[1, 1, 1],
  [1, 1, 1],
  [1, 1, 1]],
 [[1, 1, 1],
  [1, 1, 1],
  [1, 1, 1]],
 [[1, 1, 1],
  [1, 1, 1],
  [1, 1, 1]]]
二维阵列高度图:

[[0, 1, 2],
 [2, 3, 4],
 [2, 0, 0]]
期望输出:

[[[0, 1, 1],
  [1, 1, 1],
  [1, 0, 0]],
 [[0, 0, 1],
  [1, 1, 1],
  [1, 0, 0]],
 [[0, 0, 0],
  [0, 1, 1],
  [0, 0, 0]],
 [[0, 0, 0],
  [0, 0, 1],
  [0, 0, 0]]]
到目前为止,我已经使用for python循环实现了这一点,如中所示

for y in range(arr2d.shape[0]):
    for x in range(arr2d.shape[1]):
        height = arr2d[y, x]
        arr3d[height:, y, x] = 0

但这似乎是非常无效的,我觉得可能有更好的方法来做到这一点

从填充数组的快速方式中汲取灵感:

In [104]: (np.arange(4)[:,None,None]<arr2d).astype(int)                                          
Out[104]: 
array([[[0, 1, 1],
        [1, 1, 1],
        [1, 0, 0]],

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

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

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

arr3d[arr2d,np.arange3[:,无],np.arange3]=0。为使用arr2d广播的2轴和3轴制作阵列。实际上,将范围替换为arange-一次生成所有索引,而不是逐个生成。@hpaulj,它给了我数组[[0,1,1],[1,1,1],[[1,0,1],[1,0,1],[1,1,1],[1,1,0],[0,1,1],[1,1,1],[1,1,1],[1,1,1]]]这并不是我真正想要的。我忽略了一个事实,即您正在设置一个切片,以便在arr3d中使用任何值而不仅仅是1和0,我使用了arr3d[np.bitwise_notnp.arange4[:,None,None]