是否有一个Numpy焊盘等效物,可用于指定所需的尺寸?

是否有一个Numpy焊盘等效物,可用于指定所需的尺寸?,numpy,Numpy,numpy.pad希望我指定填充量,但如果我只想在每个维度中指定所需的总大小,然后对称填充数组以实现该目标,该怎么办 我不是在找人为我写函数。相反,我想知道是否有什么东西是现成的 下面是numpy.pad如何工作的示例: >>> arr = np.ones(shape=(4,4)) >>> arr array([[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.],

numpy.pad
希望我指定填充量,但如果我只想在每个维度中指定所需的总大小,然后对称填充数组以实现该目标,该怎么办

我不是在找人为我写函数。相反,我想知道是否有什么东西是现成的

下面是
numpy.pad
如何工作的示例:

>>> arr = np.ones(shape=(4,4))
>>> arr
array([[1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.]])
>>> arr = np.pad(arr, [(1,1),(1,1)])
>>> arr
array([[0., 0., 0., 0., 0., 0.],
       [0., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 0.],
       [0., 0., 0., 0., 0., 0.]])
>>>
现在我希望我有什么

>>> arr = np.ones(shape=(4,4))
>>> arr
array([[1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.]])
>>> arr = np.magic_pad(arr, (6,6))
>>> arr
array([[0., 0., 0., 0., 0., 0.],
       [0., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 0.],
       [0., 0., 0., 0., 0., 0.]])
>>>

没有内置的功能来实现精确的功能。但总有其他选择。这里有一个数组赋值-

def pad_to_shape(arr, out_shape):
    m,n = out_shape
    x,y = arr.shape
    out = np.zeros(out_shape, dtype=arr.dtype)
    mx,my = (m-x)//2, (n-y)//2
    out[mx:mx+x, my:my+y] = arr
    return out
样本运行-

In [76]: arr
Out[76]: 
array([[1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.]])

In [77]: pad_to_shape(arr, (8,6))
Out[77]: 
array([[0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.],
       [0., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 0.],
       [0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.]])

In [78]: pad_to_shape(arr, (4,6))
Out[78]: 
array([[0., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 0.]])

没有内置的功能来实现精确的功能。但总有其他选择。这里有一个数组赋值-

def pad_to_shape(arr, out_shape):
    m,n = out_shape
    x,y = arr.shape
    out = np.zeros(out_shape, dtype=arr.dtype)
    mx,my = (m-x)//2, (n-y)//2
    out[mx:mx+x, my:my+y] = arr
    return out
样本运行-

In [76]: arr
Out[76]: 
array([[1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.]])

In [77]: pad_to_shape(arr, (8,6))
Out[77]: 
array([[0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.],
       [0., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 0.],
       [0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.]])

In [78]: pad_to_shape(arr, (4,6))
Out[78]: 
array([[0., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 0.]])

下面是一个可以指定每侧所需填充量的示例:

# Value to pad by (on both sides)
pad_width_left = 5   # Padding on lefthand side
pad_width_right = 3  # Padding on righthand side

# Now pad vector
arr_padded_left = np.pad(arr, pad_width_left)[:-pad_width_left]
arr_padded_right = np.pad(arr_padded_left, pad_width_right)[pad_width_right:]

下面是一个可以指定每侧所需填充量的示例:

# Value to pad by (on both sides)
pad_width_left = 5   # Padding on lefthand side
pad_width_right = 3  # Padding on righthand side

# Now pad vector
arr_padded_left = np.pad(arr, pad_width_left)[:-pad_width_left]
arr_padded_right = np.pad(arr_padded_left, pad_width_right)[pad_width_right:]

为什么?你不能自己计算所需的参数吗。它不应该太难,也不应该花费太多的计算时间。但是,由于您只是用0填充背景,因此可以创建所需的结果数组(
np.zero((n,n)
)然后将源代码复制到一个片段中。它实际上比
pad
快。你知道
np.pad
是Python代码,不是一个快速编译的“黑盒”吗?是的,我知道。我问的是有什么东西存在。如果它不存在,我可以接受它。@AlexanderSoare发布的解决方案中有一个有效吗?@Divakar它们有效,但确实有效没有回答我的问题。我的问题是是否存在内置函数。虽然我现在很确定答案是否定的,但这正是我所需要的。@AlexanderSoare用那条注释编辑了我的文章。为什么?你不能自己计算所需的参数。这应该不会太难,也不会花费太多的计算时间。但既然你只是在填充,就不需要了背景为0时,可以创建所需的结果数组(
np.zero((n,n)
)然后将源代码复制到一个片段中。它实际上比
pad
快。你知道
np.pad
是Python代码,不是一个快速编译的“黑盒”吗?是的,我知道。我问的是有什么东西存在。如果它不存在,我可以接受它。@AlexanderSoare发布的解决方案中有一个有效吗?@Divakar它们有效,但确实有效“我没有回答我的问题。我的问题是是否存在内置函数。尽管我现在很确定答案是否定的,这正是我所需要的。”AlexanderSoare用这条注释编辑了我的帖子。