【发布时间】:2018-01-01 16:30:18
【问题描述】:
我有一个大的 (600,600,600) numpy 数组,其中填充了我的数据。现在我想从中提取区域,在通过框的任意线周围具有给定宽度。
对于这条线,我在单独的 numpy 数组中拥有每个点的 x、y 和 z 坐标。所以假设这条线在数据框中有 35 个点,那么 x、y 和 z 数组的长度也都是 35。我可以通过使用这样的索引来提取沿线本身的点
extraction = data[z,y,x]
现在理想情况下,我想通过执行以下操作在其周围提取一个框
extraction = data[z-3:z+3,y-3:y+3,z-3:z+3]
但是因为 x、y 和 z 是数组,所以这是不可能的。我能想到的唯一方法是通过每个点的for循环,所以
extraction = np.array([])
for i in range(len(x)):
extraction = np.append(extraction,data[z[i]-3:z[i]+3,y[i]-3:y[i]+3,z[i]-3:z[i]+3])
然后再对提取数组进行整形。但是,这非常慢,并且我想防止这个 for 循环中的每个切片之间存在一些重叠。
有没有一种简单的方法可以不使用 for 循环直接执行此操作?
编辑: 让我通过我想出的另一个想法来重新表述这个问题,这个想法也很慢。我有一条线穿过数据立方体。我有一个包含定义线的所有点的 x、y 和 z 坐标列表(坐标是数据立方体数组中的索引)。 例如,这些列表如下所示:
x_line: [345 345 345 345 342 342 342 342 342 342 342 342 342 342 342 342]
y_line: [540 540 540 543 543 543 543 546 546 546 549 549 549 549 552 552]
z_line: [84 84 84 87 87 87 87 87 90 90 90 90 90 93 93 93]
如您所见,其中一些坐标是相同的,因为这些线是在不同的坐标中定义的,然后根据数据框的分辨率进行分箱。 现在我想屏蔽数据立方体中距离大于 3 个单元格的所有单元格。 对于沿线的单个点 (x_line[i], y_line[i], z_line[i]),这相对容易。我为数据立方体中的坐标创建了一个网格网格,然后创建了一个零掩码数组并将所有内容都满足条件为1:
data = np.random.rand(600,600,600)
x_box,y_box,z_box = np.meshgrid(n.arange(600),n.arange(600),n.arange(600))
mask = np.zeros(np.shape(data))
for i in range(len(x_line)):
distance = np.sqrt((x_box-x_line[i])**2 + (y_box-y_line[i])**2 + (z_box-z_line[i])**2)
mask[distance <= 3] = 1.
extraction = data[mask == 1.]
这样做的好处是掩码数组消除了重复提取的问题。但是,meshgrid 和距离计算都非常慢。那么是否可以直接在整条线上进行距离计算,而不必在每个线点上进行 for 循环,以便它直接掩盖距离任何线点 3 个单元格范围内的所有单元格?
【问题讨论】:
-
... there will be some overlap between each of the slices in this for-loop I'd like to prevent。我们在谈论哪些重叠? -
例如,如果直线沿 z 轴方向行进,则点的间距将小于我在示例代码中使用的宽度为 6 的切片,因此 for 循环将包含某些沿 z 轴多次输入。解决这个问题的一种方法是先找出主轴,然后只沿其他两个轴切片,但我必须这样做很多次,所以有一种自动方式直接沿线切片会更方便.
-
我建议添加一个最小的示例案例并向我们展示预期的输出并对其进行解释。
-
我添加了一些具体的代码示例
-
您是要遮盖一个 6x6x6 的立方体,还是一个半径为 3 的球体?您的两个示例选择了不同的选项
标签: python-2.7 numpy multidimensional-array slice