假设我有这两个数组。
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 情况下轻松完成,但不止于此。 :/
最佳答案
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
(所有“堆栈”函数也是如此),所以 在 [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' 字符串的作用相同。
关于python - 如何有效地在具有不同维度的多维 numpy 数组中添加列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53876020/