numpy 用填充调整 n 维数组的大小

时间:2021-07-07 17:29:38

标签: python numpy

我有两个数组,ab

a 的形状为 (1, 2, 3, 4)

b 的形状为 (4, 3, 2, 1)

我想让它们都 (4, 3, 3, 4),新位置用 0 填充。

我能做到:

new_shape = (4, 3, 3, 4)

a = np.resize(a, new_shape)
b = np.resize(b, new_shape)

..但是这会重复每个元素以形成新元素,这对我不起作用。

相反,我认为我可以这样做:

a = a.resize(new_shape)
b = b.resize(new_shape)

...根据 documentation 用 0 填充。

但它不适用于多维数组,引发错误:

<块引用>

ValueError: resize 仅适用于单段数组

那么有没有不同的方法来实现这一目标? IE。与 np.resize 相同,但使用 0-padding?

注意:我只是在寻找纯 numpy 的解决方案。

编辑:我使用的是 numpy 版本 1.20.2

编辑:我刚刚发现它适用于数字,但不适用于对象,我忘了提到它是一个对象数组而不是数字。

1 个答案:

答案 0 :(得分:1)

resize 方法在扁平意义上用 0 填充;功能垫重复。

为了说明 resize 如何在填充前“展平”:

In [108]: a = np.arange(12).reshape(1,4,3)
In [109]: a
Out[109]: 
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11]]])
In [110]: a1 = a.copy()
In [111]: a1.resize((2,4,4))
In [112]: a1
Out[112]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [ 0,  0,  0,  0]],

       [[ 0,  0,  0,  0],
        [ 0,  0,  0,  0],
        [ 0,  0,  0,  0],
        [ 0,  0,  0,  0]]])

如果我创建一个正确形状的目标数组并复制,我可以保持原来的多维块:

In [114]: res = np.zeros((2,4,4),a.dtype)
In [115]: res[:a.shape[0],:a.shape[1],:a.shape[2]]=a
In [116]: res
Out[116]: 
array([[[ 0,  1,  2,  0],
        [ 3,  4,  5,  0],
        [ 6,  7,  8,  0],
        [ 9, 10, 11,  0]],

       [[ 0,  0,  0,  0],
        [ 0,  0,  0,  0],
        [ 0,  0,  0,  0],
        [ 0,  0,  0,  0]]])

我明确地写出了切片(为了清晰起见)。如果需要,可以通过编程方式创建这样的元组。