使用 numpy 数组连接列向量

Posted

技术标签:

【中文标题】使用 numpy 数组连接列向量【英文标题】:Concatenating column vectors using numpy arrays 【发布时间】:2013-01-22 08:36:59 【问题描述】:

我想使用 numpy 数组连接“列”向量,但因为默认情况下 numpy 将所有数组视为行向量,所以沿任何轴的 np.hstacknp.concatenate 都无济于事(np.transpose 也没有作为预期的)。

a = np.array((0, 1))
b = np.array((2, 1))
c = np.array((-1, -1))

np.hstack((a, b, c))
# array([ 0,  1,  2,  1, -1, -1])  ## Noooooo
np.reshape(np.hstack((a, b, c)), (2, 3))
# array([[ 0,  1,  2], [ 1, -1, -1]]) ## Reshaping won't help

一种可能性(但太麻烦)是

np.hstack((a[:, np.newaxis], b[:, np.newaxis], c[:, np.newaxis]))
# array([[ 0,  2, -1], [ 1,  1, -1]]) ##

有更好的方法吗?

【问题讨论】:

【参考方案1】:

我相信numpy.column_stack 应该做你想做的事。 示例:

>>> a = np.array((0, 1))
>>> b = np.array((2, 1))
>>> c = np.array((-1, -1))
>>> numpy.column_stack((a,b,c))
array([[ 0,  2, -1],
       [ 1,  1, -1]])

本质上等于

>>> numpy.vstack((a,b,c)).T

虽然。正如它在文档中所说的那样。

【讨论】:

我没看到那个!!恐怕 mathesaurus 网站已经过时了。我希望 hstack 能够在不使用 column_stack 的情况下解决问题,但这已经足够了。【参考方案2】:

我尝试了以下方法。希望这对你正在做的事情足够好?

>>> np.vstack((a,b,c))
array([[ 0,  1],
       [ 2,  1],
       [-1, -1]])
>>> np.vstack((a,b,c)).T
array([[ 0,  2, -1],
       [ 1,  1, -1]])

【讨论】:

是的,很好,谢谢,但我认为可以沿着 hstack 方式完成一些事情(我的意思是用更直接的方式。为了降低认知负荷,最好是查看并将这些向量连接为列向量) a、b 和 c 是行向量。所以这是合乎逻辑的hstack 创建一个行向量。拥有a = np.array(([0], [1]))(与bc 相同)后跟hstack 将是您想要的。 我们可以这样做,但我们也可以认为这些都是列向量,就 numpy 而言应该没问题。这种方法的问题是你已经改变了向量的形状。事实上,当我在 Matlab 中使用一些简单的线性代数并在 Python 中进行与 there 相同的操作时,我偶然发现了这一点。然而在 Matlab 中,一切都是二维矩阵,所以我们会得到一个简单的 [a' b' c'] 的结果。不幸的是,使用直接翻译np.hstack((a.T, b.T, c.T)) 确实失败了 关于评论“为了降低认知负荷,最好将这些向量作为列向量查看和连接)”,为什么不只是:np.concatenate([v.reshape((-1,1)) for v in (a, b, c)], axis=1)

以上是关于使用 numpy 数组连接列向量的主要内容,如果未能解决你的问题,请参考以下文章

Numpy - 从数组中切片二维行或列向量

Numpy_构建列向量

保持 Numpy 数组 2D

Numpy 根据另一个数组的值分配一个数组值,其中列是基于向量选择的

如何将包装为字符串的向量转换为熊猫数据框中的numpy数组?

在 Numpy 中将行向量转换为列向量