如何在Python中将向量添加到矩阵中

23

我想在Python中将一个向量添加到矩阵中。我尝试了appendconcatenate方法,但是没有得到答案。之前我在使用Matlab,并且我使用了这个:

m = zeros(10, 4) % define my matrix, 10x4
v = ones(10, 1) % my vecto, 10x1
c = [m,v] % so simple! the result is: 10x5 (the vector added as the last column)

我该如何使用numpy在python中实现这个?


你是在说C++还是Python?Python没有向量/数组,它有列表或字典。 - kylieCatt
3
他指的是NumPy数组。 - Joe Kington
抱歉,我在问题文本中添加了numpy。 - Hadi
2
我有点生疏了,但是应该是[m v],而不是[m; v],对吧? - DSM
是的,你说得对!这是拼写错误 :) - Hadi
2个回答

54

你需要使用np.r_np.c_。(类似于Matlab风格的范围生成函数,想象一下"列叠加"和"行叠加"。)

此外,还可参考np.concatenatenp.vstacknp.hstacknp.dstacknp.row_stacknp.column_stack等函数。

例如:

import numpy as np
m = np.zeros((10, 4))
v = np.ones((10, 1))
c = np.c_[m, v]

产生:

array([[ 0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  1.]])

这也可以等同于np.hstack([m, v])np.column_stack([m, v])

如果你不熟悉 MATLAB,hstackcolumn_stack可能更易读且描述更清晰。 (因此在这种情况下它们可能更好。)

然而,np.c_np.r_具有额外的功能,这些功能是来自MATLAB的人们倾向于期望的。例如:

In [7]: np.r_[1:5, 2]
Out[7]: array([1, 2, 3, 4, 2])

或者:

In [8]: np.c_[m, 0:10]
Out[8]:
array([[ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  2.],
       [ 0.,  0.,  0.,  0.,  3.],
       [ 0.,  0.,  0.,  0.,  4.],
       [ 0.,  0.,  0.,  0.,  5.],
       [ 0.,  0.,  0.,  0.,  6.],
       [ 0.,  0.,  0.,  0.,  7.],
       [ 0.,  0.,  0.,  0.,  8.],
       [ 0.,  0.,  0.,  0.,  9.]])

无论如何,对于Matlab用户来说,除了vstackhstack等函数之外,了解np.r_np.c_很方便。


好的,现在它相当完整。 - joojaa
4
完全正确,但我不建议在Python代码中使用c_r_。它们看起来很奇怪,似乎仅仅是为了照顾从MATLAB转过来的用户。 - wim
@cyborg - 基本上,这不容易理解。如果你不熟悉numpy,你认为r_会做什么?第二个(也是更大的)问题是它很令人惊讶。Python开发者习惯于使用索引来检索对象的某些部分。因此,当索引用于创建与父对象(np.r_)无关的东西时,有点令人困惑。 - Joe Kington
1
是的,这个语法不太符合 Python 的风格 - 看看 np.lib.index_tricks.AxisConcatenator.__getitem__ 的实现就能明白它有多疯狂了。我承认在交互模式下我也使用它们(而且我最初也是从 matlab 转过来的),但在脚本中你应该肯定使用 np.concatenate 和类似方法。 - wim
天啊,他们在索引技巧的实现中需要使用 sys._getframe().f_back.f_globals。就像这样疯狂的东西一定让numpy移植到Python 3花费了数年时间...我只希望他们有良好的单元测试。 - wim
显示剩余4条评论

4

在NumPy中,它是类似的:

>>> m=np.zeros((10,4))
>>> m
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])
>>> v=np.ones((10,1))
>>> v
array([[ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.]])

>>> np.c_[m,v]
array([[ 0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  1.]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接