根据 120 处相交的平面所包含的区域将 3D 矩阵拆分为 3 个部分

Split a 3D matrix into 3 parts based on the regions subtended by the planes which intersect at 120

提问人:Rupesh 提问时间:1/22/2023 更新时间:1/23/2023 访问量:91

问:

我想将单个 3D 矩阵拆分为 3 个较小的 3D 矩阵,以便任意两个平面之间的元素包含在相应的较小矩阵中。如图所示,这些平面在中心处彼此相交 120 度。 让我们说我画的图中的任何任意例子。AOPQRDA是相交平面AORD和OPQR之间形成的区域之一。总共有 3 个这样的地区。我希望每个区域中的所有元素都包含在一个单独的矩阵中。可能吗? 拆分不是基于元素值,而是基于它们所在的索引。

enter image description here

我从任何随机 3D 矩阵开始,因为这里重要的是索引。我们也可以选择任何任意中心。那些索引符合特定标准的元素应放在一个部分中。我无法想出一个合乎逻辑的计划。任何帮助都是值得赞赏的。谢谢

Python 多维数组 拆分 3D 切片

评论

0赞 Claudio 1/22/2023
事实证明,它通常有助于制定计划,试图解释问题的背景和背景。拆分的最终结果将用于什么?
0赞 Rupesh 1/22/2023
当然,我需要在那里放置一个 3D 对象,将其分成 3 个部分,计算每个部分的值并将它们积分
0赞 Claudio 1/22/2023
换句话说,您需要一个与 3D-xyz 大小相同的 2D-xy 矩阵,该矩阵填充了值,告诉具有给定索引的单个矩阵元素属于三个部分中的哪一个?

答:

0赞 Claudio 1/22/2023 #1

以下是对能够完成拆分(逻辑规划)的过程步骤的建议:

  • 创建具有 xy 大小的 3D 矩阵的白色图像
  • 绘制黑色一像素宽的线条(关闭抗锯齿),根据需要将图像分成三部分,并用三种不同的颜色填充三个部分(使用桶形油漆工具用颜色填充区域)
  • 确定黑线交点像素/点属于哪个部分并更改其颜色
  • 确定线条属于哪些部分并更改其颜色(使用桶画工具)

从图像中创建适当的 2D-xy-matrix。2D-xy-matrix 值告诉每对 [x,y] 索引 3D [x,y,z] 索引属于 3D-xyz 矩阵的哪个部分,因此您可以直接使用此信息进行计算或从 2D-xy 矩阵中创建 3D-xyz 矩阵,以获得可用于矢量化计算方式的三个部分中每个部分的 3D 掩码。

请参阅此处:如何确定一个点是否在二维三角形中?,如果您更喜欢根据 2D-xy 矩阵的索引计算 2D 掩码值,给定将区域分为三部分的三条线的交点。

评论

0赞 Rupesh 1/23/2023
谢谢,我在 2D 中划分了区域,保持 zslice 不变。我在设置条件时遇到了一些麻烦,但我想它已经完成了。
0赞 Rupesh 1/23/2023 #2

我想我设法解决了它:

import numpy as np
from scipy import ndimage
matrix=np.random.randint(0, 10, (5, 7, 7))
section1=[]
section2=[]
section3=[]
shape=matrix.shape
center_of_mass=[round(i) for i in ndimage.measurements.center_of_mass(matrix)][1::]
for z in range(shape[0]):
    for x in range(shape[1]):
        for y in range(shape[2]):
            if (x <=center_of_mass[0] and y <=center_of_mass[1]) or (x >center_of_mass[0] and y<=shape[2]-x-1):
                section1.append(matrix[z,x,y])
            if (x <=center_of_mass[0] and y >center_of_mass[1]) or (x >center_of_mass[0] and y>=x):
                section2.append(matrix[z,x,y])
            if (x >center_of_mass[0] and y>shape[2]-x-1) and (x >center_of_mass[0] and y<x) :
                section3.append(matrix[z,x,y])
[np.array(section1), np.array(section2) ,np.array(section3)]

评论

0赞 Azhar Khan 1/24/2023
用户发现很难理解只有代码的答案而没有解释。请添加一些描述,解释它的作用以及它如何解决问题,或者在源代码的适当位置添加注释。
0赞 Rupesh 1/25/2023
我写了一个最简单的代码,其中包含描述组件的变量。对不起,但我在解释 if 和 else 条件或 for 循环时感觉不对。很明显,它需要一个 3D 列表并根据区域划分元素。问题中的信息 ID。