如何使用不同形状的数组在某些维度上附加两个numpy数组



我有两个数组,一个是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,)arr2broadcasting填充(4,6,2)空间(就像它是(1,1,2)形状一样)

res = np.zeros((4,6,3),int)
res[:,:,[0]] = arr1
res[:,:,1:] = np.array((2,3))

最新更新