我在2d中有一个(w,h) np数组。我想做一个三维空间它的值大于1然后沿着三维空间复制它的值。我希望广播能做到,但不行。我就是这么做的
arr = np.expand_dims(arr, axis=2)
arr = np.concatenate((arr,arr,arr), axis=2)
有更快的方法吗?
您可以将所有dim向前推进,引入单个dim/new轴作为创建3D
数组的最后一个dim,然后沿着np.repeat
重复三次,如下-
arr3D = np.repeat(arr[...,None],3,axis=2)
这是使用np.tile
-
arr3D = np.tile(arr[...,None],3)
另一种可行的方法:
x_train = np.stack((x_train,) * 3, axis=-1)
较好地帮助将灰色a通道矩阵转换为3通道矩阵
img3 = np.zeros((gray.shape[0],gray.shape[1],3))
img3[:,:,0] = gray
img3[:,:,1] = gray
img3[:,:,2] = gray
fig = plt.figure(figsize = (15,15))
plt.imshow(img3)
另一种简单的方法是使用矩阵乘法-乘以一个1的矩阵,实质上是将值复制到新维度:
a=np.random.randn(4,4) #a.shape = (4,4)
a = np.expand_dims(a,-1) #a.shape = (4,4,1)
a = a*np.ones((1,1,3))
a.shape #(4, 4, 3)
我建议您使用裸机 numpy.concatenate()
,因为下面的代码显示它是所有其他建议答案中最快的:
# sample 2D array to work with
In [51]: arr = np.random.random_sample((12, 34))
# promote the array `arr` to 3D and then concatenate along `axis 2`
In [52]: arr3D = np.concatenate([arr[..., np.newaxis]]*3, axis=2)
# verify for desired shape
In [53]: arr3D.shape
Out[53]: (12, 34, 3)
你可以看看下面的时间来说服自己。(排序:从优到劣):
In [42]: %timeit -n 100000 np.concatenate([arr[..., np.newaxis]]*3, axis=2)
1.94 µs ± 32.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [43]: %timeit -n 100000 np.repeat(arr[..., np.newaxis], 3, axis=2)
4.38 µs ± 46.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [44]: %timeit -n 100000 np.dstack([arr]*3)
5.1 µs ± 57.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [49]: %timeit -n 100000 np.stack([arr]*3, -1)
5.12 µs ± 125 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [46]: %timeit -n 100000 np.tile(arr[..., np.newaxis], 3)
7.13 µs ± 85.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
话虽如此,如果你正在寻找最短的代码片段,那么你可以使用:
# wrap your 2D array in an iterable and then multiply it by the needed depth
arr3D = np.dstack([arr]*3)
# verify shape
print(arr3D.shape)
(12, 34, 3)
这样可以。(我认为这不会是一个推荐的方式:-)但也许这是你认为最接近的方式。)
np.array([img, img, img]).transpose(1,2,0)
只是堆叠目标(img
)任何时候你想(3
),并使通道(3
)去最后一个轴。
不确定我是否理解正确,但在这种情况下广播似乎对我有效:
>>> a = numpy.array([[1,2], [3,4]])
>>> c = numpy.zeros((4, 2, 2))
>>> c[0] = a
>>> c[1:] = a+1
>>> c
array([[[ 1., 2.],
[ 3., 4.]],
[[ 2., 3.],
[ 4., 5.]],
[[ 2., 3.],
[ 4., 5.]],
[[ 2., 3.],
[ 4., 5.]]])