如何以这种方式操作numpy数组?

时间:2017-12-10 04:24:14

标签: python numpy

我有一个(28,28)数组a。我想获得一个(28,28,3)数组b s.t. b[i][j][0] = b[i][j][1] = b[i][j][2] = a[i][j]

有没有任何numpy快捷方式,没有繁琐的循环执行此操作?

3 个答案:

答案 0 :(得分:1)

>>> import numpy as np
>>> a = np.zeros((28,28))
>>> b = np.dstack((a,a,a))
>>> a.shape
(28, 28)
>>> b.shape
(28, 28, 3)

示例:

>>> a = np.array([[1,2],[3,4]])
>>> b = np.dstack((a,a,a))
>>> a
array([[1, 2],
       [3, 4]])
>>> b
array([[[1, 1, 1],
        [2, 2, 2]],

       [[3, 3, 3],
        [4, 4, 4]]])

答案 1 :(得分:1)

您可以将轴追加到a,然后重复n=3次:

>>> a = np.random.randn(28, 28)
>>> b = np.repeat(np.atleast_3d(a), repeats=3, axis=-1)
>>> b.shape 
(28, 28, 3)

根据需要,

>>> np.all(a == b[...,0])
True
>>> np.all(b[...,0] == b[...,1])
True
>>> np.all(b[...,1] == b[...,2])
True

答案 2 :(得分:0)

您可以分配b并使用广播:

b = np.empty(a.shape + (3,), a.dtype)
b[...] = a[..., None]

如果您只需要读访问权限,那么一种非常有效的方法是创建一个跨步视图:

c = np.lib.stride_tricks.as_strided(a, a.shape + (3,), a.strides + (0,))

这与a共享其数据,这意味着当您写信至c时,a也会发生变化。此外,沿着最后一个轴,步幅为零意味着例如c [1,1,0]和c [1,1,2]是相同的存储器,改变一个而另一个也将改变。如果不希望复制:

b = c.copy()