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

标签 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 情况下轻松完成,但不止于此。 :/

最佳答案

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/

相关文章:

python - 如何获得渲染的 Sprite 图像的连续移动(pygame)

python - docker pip install 不适用于需求文件

python - 从python中的sklearn线性回归获取置信区间

C - 一维数组组的最大值

python - 如何在 python tkinter 中停止此函数

C: 打印 char * 数组的问题

numpy - 在 numba nopython 函数中使用 numpy.datetime?

python - 在行差异中添加列结果

python - 对另一个二维数组的二维数组的每一行执行数学运算

java - 从二维数组中删除行