繁体   English   中英

3D numpy 数组中的两个非零元素是否“连接”?

[英]Are two non-zero elements in a 3D numpy array “connected”?

将 3D 空间视为 3D 空间的 3D numpy 数组,如果存在从 A 到 B 的每个相邻元素的路径,则两个数组索引 A 和 B 是“连接的”,其中 Path[i] 是数组索引的列表Path[i+1] 是 (1) 输入数组中非零元素的索引和 (2) “下一个”,np.max(np.abs(Path[i] - Path[i+1] )) <= 1。

给定一个初始索引 A,我想生成列表 A_Connected,它是所有“连接”到 A 的数组索引的列表。

我的慢方法是:

def find_connected_list(array, index, connected_list):
   connected_list.append(index)

   for x in range(index[0]-1, index[0]+2):
      for y in range(index[1]-1, index[1]+2):
         for z in range(index[2]-1, index[2]+2):
            if x>= 0 and x < array.shape[0] and y >= 0 and y < array.shape[1] and z >= 0 and z < array.shape[2] and array[x,y,z] > 0 and not [x,y,z] in connected_list:
               connected_list = find_connected_list(array, [x,y,z], connected_list)

   return connected_list

你需要从一个完全不同的角度来看待这个问题。 这是一个需要转换矩阵的图形问题。

  • 对于数组的每个元素,您应该确定其直接连接的邻居

  • 结果应存储在 2d NxN 数组中,其中 N 是 3d 数组中的元素总数,这是转换矩阵 T

  • 然后,您的出发点是长度为 N 的向量 V,其中 N-1 个零和一个 1

  • 计算 T^k V 并增加 T 以找到距离 V 为 k 步的所有连接点

这只是一个指南,您将在此处找到详细信息。

Python编码不是很困难。 您可以使用 T 与对角线中的 1 对称的事实来加快该过程。

希望它有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM