从图像numpy生成一批克隆

sdr*_*abb 5 python numpy

我有一个名为anumpy数组(一个图像),其大小如下:

[3,128,192]
Run Code Online (Sandbox Code Playgroud)

现在我想创建一个 numpy 数组,其中包含具有以下维度的a 的n 个副本:

[n,3,128,192]
Run Code Online (Sandbox Code Playgroud)

是否存在一个 numpy 函数可以在不使用循环指令的情况下帮助我解决这个问题?

kma*_*o23 7

只需使用 np.stack

# say you need 10 copies of a 3D array `a`
In [267]: n = 10

In [266]: np.stack([a]*n)
Run Code Online (Sandbox Code Playgroud)

或者,np.concatenate如果您真的很关心性能,则应该使用。

In [285]: np.concatenate([a[np.newaxis, :, :]]*n)
Run Code Online (Sandbox Code Playgroud)

例子:

In [268]: a
Out[268]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]],

       [[16, 17, 18, 19],
        [20, 21, 22, 23],
        [24, 25, 26, 27],
        [28, 29, 30, 31]],

       [[32, 33, 34, 35],
        [36, 37, 38, 39],
        [40, 41, 42, 43],
        [44, 45, 46, 47]]])

In [271]: a.shape
Out[271]: (3, 4, 4)

In [269]: n = 10

In [270]: np.stack([a]*n).shape
Out[270]: (10, 3, 4, 4)

In [285]: np.concatenate([a[np.newaxis, :, :]]*n).shape
Out[285]: (10, 3, 4, 4)
Run Code Online (Sandbox Code Playgroud)

表现:

# ~ 4x faster than using `np.stack`
In [292]: %timeit np.concatenate([a[np.newaxis, :, :]]*n)
100000 loops, best of 3: 10.7 µs per loop

In [293]: %timeit np.stack([a]*n)
10000 loops, best of 3: 41.1 µs per loop
Run Code Online (Sandbox Code Playgroud)