【发布时间】:2020-10-24 17:59:37
【问题描述】:
我有一个大型 3D、N x N x N、numpy 数组,在数组中的每个索引处都有一个值。
我希望能够使用中心点从数组中取出三次切片:
def take_slice(large_array, center_point):
...
return cubic_slice_from_center
为了说明,我希望cubic_slice_from_center 返回以下形状,其中 slice[1][1][1] 将是用于生成切片的中心点的值:
print(cubic_slice_from_center)
array([[[0.32992015, 0.30037145, 0.04947877],
[0.0158681 , 0.26743224, 0.49967057],
[0.04274621, 0.0738851 , 0.60360489]],
[[0.78985965, 0.16111745, 0.51665212],
[0.08491344, 0.30240689, 0.23544363],
[0.47282742, 0.5777977 , 0.92652398]],
[[0.78797628, 0.98634545, 0.17903971],
[0.76787071, 0.29689657, 0.08112121],
[0.08786254, 0.06319838, 0.27050039]]])
我研究了几种方法来做到这一点。一种方法如下:
def get_cubic_slice(space, slice_center_x, slice_center_y, slice_center_z):
return space[slice_center_x-1:slice_center_x+2,
slice_center_y-1:slice_center_y+2,
slice_center_z-1:slice_center_z+2]
只要三次切片不在边缘上,它就可以工作,但如果它在边缘上,它会返回一个空数组!
有时,切片的中心点会位于 3D numpy 数组的边缘。发生这种情况时,我不想返回任何内容,而是返回空间边界内的立方空间切片的值,并且在切片超出范围的情况下,用 np.nan 值填充返回数组.
例如,对于 20 x 20 x 20 的空间,x、y 和 z 轴的索引为 0-19,我希望 get_cubic_slice 函数为点返回以下类型的结果 (0,5, 5):
print(get_cubic_slice(space,0,5,5))
array([[[np.nan, np.nan, np.nan],
[np.nan , np.nan, np.nan],
[np.nan, np.nan , np.nan]],
[[0.78985965, 0.16111745, 0.51665212],
[0.08491344, 0.30240689, 0.23544363],
[0.47282742, 0.5777977 , 0.92652398]],
[[0.78797628, 0.98634545, 0.17903971],
[0.76787071, 0.29689657, 0.08112121],
[0.08786254, 0.06319838, 0.27050039]]])
使用 numpy 执行此操作的最佳方法是什么?
【问题讨论】:
-
我不知道最好的情况,但如果你对数组进行足够的填充
nan对所有点进行切片会很容易。
标签: python numpy multidimensional-array slice