给定一个数组image
它可能是一个2D,3D或4D,但是更可取的nD数组,我想用一个列表来提取数组的一个连续部分,列表表示我如何如果扩展名不在图像中,则沿着所有轴延伸并填充pad_value
。用填充切片numpy ayarray独立于数组维度
我想出了这一点:
def extract_patch_around_point(image, loc, extend, pad_value=0):
offsets_low = []
offsets_high = []
for i, x in enumerate(loc):
offset_low = -np.min([x - extend[i], 0])
offsets_low.append(offset_low)
offset_high = np.max([x + extend[i] - image.shape[1] + 1, 0])
offsets_high.append(offset_high)
upper_patch_offsets = []
lower_image_offsets = []
upper_image_offsets = []
for i in range(image.ndim):
upper_patch_offset = 2*extend[i] + 1 - offsets_high[i]
upper_patch_offsets.append(upper_patch_offset)
image_offset_low = loc[i] - extend[i] + offsets_low[i]
image_offset_high = np.min([loc[i] + extend[i] + 1, image.shape[i]])
lower_image_offsets.append(image_offset_low)
upper_image_offsets.append(image_offset_high)
patch = pad_value*np.ones(2*np.array(extend) + 1)
# This is ugly
A = np.ix_(range(offsets_low[0], upper_patch_offsets[0]),
range(offsets_low[1], upper_patch_offsets[1]))
B = np.ix_(range(lower_image_offsets[0], upper_image_offsets[0]),
range(lower_image_offsets[1], upper_image_offsets[1]))
patch[A] = image[B]
return patch
目前它只能在2D是因为用A,B索引绝招等等,我不想检查的维数,并使用不同的索引方案。我如何使这个独立的image.ndim
?
'numpy'函数可以处理可变数量的维度。他们将维度扩展到某个期望的数字(查看'atleast_3d'的代码)。他们交换坐标轴,以便工作坐标系(与坐骑相反)按照已知的顺序(在开始或结束时)。他们创建索引元组。 – hpaulj