如何有效地在具有不同维度的多维numpy数组中添加列?

时间:2018-12-20 21:04:33

标签: python arrays numpy

说我有这两个数组。

a = np.ones((2, 3, 4))
[[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]

[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]]

b = np.ones(6) * 9
[9. 9. 9. 9. 9. 9.]

问题。如何有效地使c看起来像这样。

[[[1. 1. 1. 1. 9.]
[1. 1. 1. 1. 9.]
[1. 1. 1. 1. 9.]]

[[1. 1. 1. 1. 9.]
[1. 1. 1. 1. 9.]
[1. 1. 1. 1. 9.]]]

我尝试使用np.c_,np.column_stack和np.insert,但是我一直在努力弄清楚如何正确设置尺寸。在1D和2D情况下,我可以轻松完成此操作,但除此之外,还可以做更多。 :/

1 个答案:

答案 0 :(得分:3)

a是(2,3,4)。要在最后一个轴上串联,b必须为(2,3,1)(或更一般而言为(2,3,n))。 b.reshape(2,3)可助您一臂之力,添加np.newaxis可助您一臂之力。或在整形中包含第3轴:b.reshape(2,3,1)

In [21]: np.concatenate((a, b.reshape(2,3)[:,:,None]),-1)
Out[21]: 
array([[[1., 1., 1., 1., 9.],
        [1., 1., 1., 1., 9.],
        [1., 1., 1., 1., 9.]],

       [[1., 1., 1., 1., 9.],
        [1., 1., 1., 1., 9.],
        [1., 1., 1., 1., 9.]]])

np.c_使用相同的重塑np.c_[a, b.reshape(2,3,1)]

np.c_(或np.r_)采用一个字符串参数,告诉它在需要时如何扩展尺寸。 np.c_等效于np.r_['-1,2,0',a, b.reshape(2,3)[:,:,None]]。该字符串参数有点难以理解,但经过反复试验,我发现这可行:

In [27]: np.c_['-1,3,0',a, b.reshape(2,3)]
Out[27]: 
array([[[1., 1., 1., 1., 9.],
        [1., 1., 1., 1., 9.],
        [1., 1., 1., 1., 9.]],

       [[1., 1., 1., 1., 9.],
        [1., 1., 1., 1., 9.],
        [1., 1., 1., 1., 9.]]])

请记住,np.c_使用np.concatenate(与所有“堆栈”函数一样),因此In [21]是最直接的版本。仍然有些人喜欢np.c_格式的便利性。

({np.column_stack在第1轴上加入;文档明确讨论了返回2d数组。您有3d情况。)

dstack(“深度”堆栈)有效:np.dstack((a, b.reshape(2,3)))。它使用以下命令创建3d数组:

In [49]: np.atleast_3d(b.reshape(2,3)).shape
Out[49]: (2, 3, 1)

在这种情况下与'-1,3,0'字符串相同。