沿轴零垫ndarray

时间:2019-05-10 10:48:16

标签: python arrays numpy

我要填充:

[[1, 2]
 [3, 4]]

[[0, 0, 0]
 [0, 1, 2]
 [0, 3, 4]]

当vstack和hsrack输入2D时,我这样做没有问题

但是,当我添加1个dim来代表数字的dim时,例如:

img = np.random.randint(-10, 10, size=(2, 2, 2))

如果我不想使用for循环,则无法这样做。 有什么方法可以避免,但只有numpy的堆栈可以做到?

ps:对于本示例,我应该通过每2个img实例获得(2,3,3)数组,在第1列和第1行上按零填充。

谢谢

2 个答案:

答案 0 :(得分:2)

您可以使用np.pad,它允许您指定填充到每个轴边缘的值的数量。

因此对于第一个示例2D数组,您可以这样做:

a = np.array([[1, 2],[3, 4]])
np.pad(a,((1, 0), (1, 0)), mode = 'constant')

array([[0, 0, 0],
       [0, 1, 2],
       [0, 3, 4]])

因此,这里每个元组代表沿每个轴填充零的那一侧,即((before_1, after_1), … (before_N, after_N))


对于3D数组也是如此,但是在这种情况下,我们必须指定我们只想zero填充最后两个维度:

img = np.random.randint(-10, 10, size=(2, 2, 2))
np.pad(img, ((0,0), (1,0), (1,0)), 'constant')

array([[[ 0,  0,  0],
        [ 0, -3, -2],
        [ 0,  9, -5]],

       [[ 0,  0,  0],
        [ 0,  1, -9],
        [ 0, -1, -3]]])

答案 1 :(得分:1)

您可以使用np.pad并删除最后一行/列:

import numpy as np

a = np.array([[1, 2], [3, 4]])
result = np.pad(a, 1, mode='constant', constant_values=0)[:-1, :-1]
print(result)

输出:

[[0 0 0]
 [0 1 2]
 [0 3 4]]