我有两个数组,一个是shape(4,6,1)。我想将存储在另一个shape(2,)数组中的两个值附加到第三维,这样我最终得到一个shape(4,6,3)数组。
我该怎么做?
例如:
arr1 = np.repeat(np.array([[[1], [1], [1], [1], [1], [1]]]), 4, axis=0)
arr2 = np.array([2, 3])
我们有arr1 =
arr1 = [[[1]
[1]
[1]
[1]
[1]
[1]]
[[1]
[1]
[1]
[1]
[1]
[1]]
[[1]
[1]
[1]
[1]
[1]
[1]]
[[1]
[1]
[1]
[1]
[1]
[1]]]
我们想以
结尾[[[1 2 3]
[1 2 3]
[1 2 3]
[1 2 3]
[1 2 3]
[1 2 3]]
[[1 2 3]
[1 2 3]
[1 2 3]
[1 2 3]
[1 2 3]
[1 2 3]]
[[1 2 3]
[1 2 3]
[1 2 3]
[1 2 3]
[1 2 3]
[1 2 3]]
[[1 2 3]
[1 2 3]
[1 2 3]
[1 2 3]
[1 2 3]
[1 2 3]]]
请记住,我在这里像这样生成数组,所以我们有一个例子来解决。
我发现了一种非常复杂的方法,但感觉一定有一些愚蠢的魔法或功能应该工作。
这是我发现的:
arr1 = np.repeat(np.array([[[1], [1], [1], [1], [1], [1]]]), 4, axis=0)
arr2 = np.array([2, 3])
arr2 = np.repeat(arr2, 6, axis=0)
arr2 = arr2.reshape(2, 6).T
arr2 = arr2.reshape(1, self.lag, -1)
arr2 = np.repeat(arr2, 4, axis=0)
print(arr1.shape)
print(arr2.shape)
arr3 = np.append(arr1, arr2, axis=2)
print(arr3)
我们得到了我们想要的结果,但是有没有更好的方法呢?
IIUC,可以用numpy.broadcast_to
广播arr2
的前2维,然后dstack
:
np.dstack([arr1, np.broadcast_to(arr2, arr1.shape[:2]+arr2.shape)])
输出:
array([[[1, 2, 3],
[1, 2, 3],
[1, 2, 3],
[1, 2, 3],
[1, 2, 3],
[1, 2, 3]],
[[1, 2, 3],
[1, 2, 3],
[1, 2, 3],
[1, 2, 3],
[1, 2, 3],
[1, 2, 3]],
[[1, 2, 3],
[1, 2, 3],
[1, 2, 3],
[1, 2, 3],
[1, 2, 3],
[1, 2, 3]],
[[1, 2, 3],
[1, 2, 3],
[1, 2, 3],
[1, 2, 3],
[1, 2, 3],
[1, 2, 3]]])
np.tile
可以为您做这两个repeats
:
arr1 = np.repeat(np.array([[[1], [1], [1], [1], [1], [1]]]), 4, axis=0)
arr2 = np.array([2, 3])
arr2 = np.repeat(arr2, 6, axis=0)
arr2 = arr2.reshape(2, 6).T
arr2 = arr2.reshape(1, 6, -1)
arr2 = np.repeat(arr2, 4, axis=0)
arr2.shape
Out[129]: (4, 6, 2)
np.tile(np.array((2,3))[None,None,:], (4,6,1)).shape
Out[130]: (4, 6, 2)
np.concatenate((arr1,np.tile(np.array((2,3))[None,None,:], (4,6,1))), axis=2).shape
Out[132]: (4, 6, 3)
另一个想法是先创建目标数组,然后填充它。(2,)arr2
用broadcasting
填充(4,6,2)空间(就像它是(1,1,2)形状一样)
res = np.zeros((4,6,3),int)
res[:,:,[0]] = arr1
res[:,:,1:] = np.array((2,3))