【发布时间】:2023-03-05 12:18:02
【问题描述】:
我有一个对象占用了一个底层的 N 维方形网格(由一个 numpy 数组表示),因此只有 25% 的网格点被占用。此网格中的每个 1x1x1x...N 立方体(即超立方体)包含相同数量的此对象(仅位于此超立方体的某些顶点处)。我有一个所有占用网格点的坐标数组。任务是循环遍历这个数组并提取每个 1x1x1... 超立方体的占用坐标并将它们存储在一个新数组中以供进一步处理。
最好通过例子来解释这种情况。考虑选择底层网格的 3-D 情况,以便1<=i,j,k<=4 给出 2d numpy 数组:
A = [
[1 1 1]
[1 2 1]
[1 3 1]
[1 4 1]
[2 1 1]
[2 2 1]
[2 3 1]
[2 4 1]
[3 1 1]
[3 2 1]
[3 3 1]
[3 4 1]
[4 1 1]
[4 2 1]
[4 3 1]
[4 4 1]
[1 1 2]
[1 2 2]
[1 3 2]
[1 4 2]
[2 1 2]
[2 2 2]
[2 3 2]
[2 4 2]
[3 1 2]
[3 2 2]
[3 3 2]
[3 4 2]
[4 1 2]
[4 2 2]
[4 3 2]
[4 4 2]
[1 1 3]
[1 2 3]
[1 3 3]
[1 4 3]
[2 1 3]
[2 2 3]
[2 3 3]
[2 4 3]
[3 1 3]
[3 2 3]
[3 3 3]
[3 4 3]
[4 1 3]
[4 2 3]
[4 3 3]
[4 4 3]
[1 1 4]
[1 2 4]
[1 3 4]
[1 4 4]
[2 1 4]
[2 2 4]
[2 3 4]
[2 4 4]
[3 1 4]
[3 2 4]
[3 3 4]
[3 4 4]
[4 1 4]
[4 2 4]
[4 3 4]
[4 4 4]
]
在这种情况下我需要处理的 2d numpy 数组的一个示例是:
B = [[1,1,1],[1,2,1],[1,3,1],[1,4,1],[2,2,1],[2,3, 1],[2,4,1],[3,2,1],[3,3,1],[3,4,1],[4,1,1],[4,3,1] ,[1,1,2],[1,4,2],[2,1,2],[2,2,2],[2,4,2],[3,1,2],[ 3,2,2],[3,4,2],[4,1,2],[4,2,2],[4,3,2],[4,4,2],[1, 1,3],[1,4,3],[2,1,3],[2,2,3],[2,3,3],[2,4,3],[3,1, 3],[3,2,3],[3,3,3],[4,1,3],[4,2,3],[4,3,3],[4,4,3] ,[1,2,4],[1,3,4],[1,4,4],[2,1,4],[2,2,4],[2,3,4],[ 3,1,4],[3,2,4],[3,3,4],[4,3,4],[4,4,4]]
B 仅是占用网格点的数组。循环通过B,我想获得与底层网格的每个立方体相关的占用坐标。立方体边缘由1<=i,j,k<=2、(3<=i<=4) & (1<=j,k<=2) 等定义。例如,对于由1<=i,j,k<=2 划分的立方体,我想提取数组 [[1,1,1 ],[1,1,2],[1,2,1],[2,1,2],[2,2,1],[2,2,2]] 来自B 并将其存储在用于进一步处理的新数组。然后重复此操作,直到本示例中的所有 8 个立方体都被计算在内。请注意,始终选择均匀的网格,以便始终可以进行这种类型的分区。虽然我可以选择均匀的网格,但我无法控制对象的场地占用。
Numpy 数组切片不起作用,因为通常B 中的网格点不连续。我尝试了一个使用“for”循环的代码来强加立方体边缘的范围,但它很快就变得太复杂了,而且它似乎不是正确的方法。然后是“numpy.where”函数;但条件的复杂性使其相当棘手。 “numpy.extract”也有类似的挑战。
【问题讨论】:
-
所以你的输入总是一个完全格在一些区间的乘积中?如果是这样,您只需要这些区间的边界即可生成所有小数组……
-
@DavisHerring 对不起戴维斯,最初的问题不是很清楚。我现在已经对它进行了广泛的修改,所以我希望现在我想要做的事情更清楚了。
-
显然你的“查询”立方体是不相交的——例如,在你的例子中没有
2<=i,j,k<=3。如果我猜对了,你应该这么说。 -
它更清楚了,但
A仍然仅在其范围内相关(以防B没有触及边界框的每个面)。 -
@DavisHerring 是的,它们是故意不相交的,因此每个顶点只属于一个立方体。