我要填充:
[[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行上按零填充。
谢谢
答案 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]]