说我有这两个数组。
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情况下,我可以轻松完成此操作,但除此之外,还可以做更多。 :/
答案 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'字符串相同。