提问人:Rupesh 提问时间:1/22/2023 更新时间:1/23/2023 访问量:91
根据 120 处相交的平面所包含的区域将 3D 矩阵拆分为 3 个部分
Split a 3D matrix into 3 parts based on the regions subtended by the planes which intersect at 120
问:
我想将单个 3D 矩阵拆分为 3 个较小的 3D 矩阵,以便任意两个平面之间的元素包含在相应的较小矩阵中。如图所示,这些平面在中心处彼此相交 120 度。 让我们说我画的图中的任何任意例子。AOPQRDA是相交平面AORD和OPQR之间形成的区域之一。总共有 3 个这样的地区。我希望每个区域中的所有元素都包含在一个单独的矩阵中。可能吗? 拆分不是基于元素值,而是基于它们所在的索引。
我从任何随机 3D 矩阵开始,因为这里重要的是索引。我们也可以选择任何任意中心。那些索引符合特定标准的元素应放在一个部分中。我无法想出一个合乎逻辑的计划。任何帮助都是值得赞赏的。谢谢
答:
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。
评论