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