小编jbr*_*own的帖子

更有效的交叉路口计算方法?

我有一个300000列表(光纤轨道)的列表,其中每个轨道是(x,y,z)元组/坐标的列表:

tracks=
[[(1,2,3),(3,2,4),...]
 [(4,2,1),(5,7,3),...]
 ...
]
Run Code Online (Sandbox Code Playgroud)

我还有一组蒙版,其中每个蒙版被定义为(x,y,z)元组/坐标的列表:

mask_coords_list=
[[(1,2,3),(8,13,4),...]
 [(6,2,2),(5,7,3),...]
 ...
]
Run Code Online (Sandbox Code Playgroud)

我试图找到所有可能的面具对:

  1. 与每个掩码 - 掩码对相交的轨道数(以创建连接矩阵)
  2. 与每个蒙版相交的轨道子集,以便为子集中的每个轨道的每个(x,y,z)坐标添加1(以创建"密度"图像)

我现在正在做第1部分:

def mask_connectivity_matrix(tracks,masks,masks_coords_list):
    connect_mat=zeros((len(masks),len(masks)))
    for track in tracks:
        cur=[]
        for count,mask_coords in enumerate(masks_coords_list):
            if any(set(track) & set(mask_coords)):
                cur.append(count)
            for x,y in list(itertools.combinations(cur,2)):
                connect_mat[x,y] += 1
Run Code Online (Sandbox Code Playgroud)

和第2部分一样:

def mask_tracks(tracks,masks,masks_coords_list):
    vox_tracks_img=zeros((xdim,ydim,zdim,len(masks)))
    for track in tracks:
        for count,mask in enumerate(masks_coords_list):
            if any(set(track) & set(mask)):
                for x,y,z in track:
                    vox_tracks_img[x,y,z,count] += 1
Run Code Online (Sandbox Code Playgroud)

使用集合查找交叉点已大大加快了这一过程,但当我有70个或更多掩码的列表时,这两个部分仍然需要一个多小时.有没有比为每个轨道迭代更有效的方法?

python algorithm set

5
推荐指数
1
解决办法
1505
查看次数

3D线段盒交点

寻找代码来检测 3D 线段(不是直线/射线)和 3D 框(不一定是立方体,但始终轴对齐)之间的交集。这些盒子是体素,因此它们具有规则的间距。

已经有找到线段/平面交点的代码。理想情况下,我想找到一种有效的解决方案来适应矩形,对 3d 框的每个面重复此操作,然后迭代数万个线段和框。

seg_start = array([x1,y1,z1])
seg_end = array([x2,y2,z2])
plane_point = array([x3,y3,z3])
plane_normal = array([x4,y4,z4])
u = seg_end - seg_start
w = seg_start - plane_point
D = dot(plane_normal,u)
N = -dot(plane_normal,w)
sI = N / D
if sI >= 0 and sI <= 1:
    return 1
Run Code Online (Sandbox Code Playgroud)

python 3d

5
推荐指数
1
解决办法
9667
查看次数

标签 统计

python ×2

3d ×1

algorithm ×1

set ×1