使用 numpy 数组连接列向量
Posted
技术标签:
【中文标题】使用 numpy 数组连接列向量【英文标题】:Concatenating column vectors using numpy arrays 【发布时间】:2013-01-22 08:36:59 【问题描述】:我想使用 numpy 数组连接“列”向量,但因为默认情况下 numpy 将所有数组视为行向量,所以沿任何轴的 np.hstack
和 np.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]))
(与b
和c
相同)后跟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 根据另一个数组的值分配一个数组值,其中列是基于向量选择的