我有一个(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快捷方式,没有繁琐的循环执行此操作?
答案 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()