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

时间:2020-01-22 02:51:40

标签: python arrays numpy indexing heightmap

我想将2D数组用作3D数组的索引,并将其用作到3D数组的索引轴0的高度图。是否有一个有效的“ numpy方式”做到这一点?在我的示例中,我想将每个对应的支柱2中的所有高度都设置为等于或大于高度图的高度零。例: 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]]]

2D数组(高度图):

[[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

但这似乎效率很低,我觉得可能有更好的方法可以做到这一点。

1 个答案:

答案 0 :(得分:1)

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

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]]])