我正在尝试将 1D 连接到 2D 数组。我想避免执行循环,因为如果我的数组长度大于 1000,它会占用大量计算机资源。
我已经尝试过 vstack、stack 和 concatenate,但都没有成功。
import numpy as np
array_a = np.array([1,2,3])
array_b = np.array([[10, 11, 12], [20, 21, 22], [30, 31, 32]])
预期的输出应该是
array([[1, 10, 11, 12], [2, 20, 21, 22], [3, 30, 31, 32]])
非常感谢您的帮助!
请您参考如下方法:
Mykola 展示了执行此操作的正确方法,但我怀疑您需要一些帮助才能理解其中的原因。你尝试了几件事,却没有告诉我们哪里出了问题。
In [241]: array_a = np.array([1,2,3])
...: array_b = np.array([[10, 11, 12], [20, 21, 22], [30, 31, 32]])
vstack 运行:
In [242]: np.vstack((array_a, array_b))
Out[242]:
array([[ 1, 2, 3],
[10, 11, 12],
[20, 21, 22],
[30, 31, 32]])
但结果是一个垂直连接,按行而不是按列。 vstack 中的 v 应该提醒我们这一点。
stack 尝试在新 轴上连接数组,并要求所有输入数组具有匹配的形状:
In [243]: np.stack((array_a, array_b))
...
ValueError: all input arrays must have the same shape
我怀疑你是随意尝试的,没有真正阅读文档。
这两个都使用concatenate,这是基本的连接器。但它对尺寸很挑剔:
In [244]: np.concatenate((array_a, array_b))
...
ValueError: all the input arrays must have same number of dimensions, but the array at index 0 has 1 dimension(s) and the array at index 1 has 2 dimension(s)
您清楚地意识到维度数不匹配。
您想制作一个 (3,4) 数组。一个是 (3,3),另一个需要是 (3,1)。并且连接轴需要为1
In [247]: np.concatenate((array_a[:,None], array_b), axis=1)
Out[247]:
array([[ 1, 10, 11, 12],
[ 2, 20, 21, 22],
[ 3, 30, 31, 32]])
如果我们创建一个 (1,3) 数组,并尝试在默认的 0 轴上进行连接,我们会得到与 vstack 相同的结果。事实上,这就是 vstack 所做的:
In [248]: np.concatenate((array_a[None,:], array_b))
Out[248]:
array([[ 1, 2, 3],
[10, 11, 12],
[20, 21, 22],
[30, 31, 32]])
另一个函数是:
In [249]: np.column_stack((array_a, array_b))
Out[249]:
array([[ 1, 10, 11, 12],
[ 2, 20, 21, 22],
[ 3, 30, 31, 32]])
这与 [247] 的作用相同。
像 vstack 和 column_stack 这样的函数很方便,但从长远来看,最好了解如何使用 concatenate 本身。
