在Numpy中将向量附加到矩阵的优雅解决方案?

时间:2017-03-08 15:18:15

标签: python numpy

我已经看到其他人发帖了,但我不清楚是否有更好的解决方案。我有一个2D NumPy数组,我想在其中添加一列。例如:

import numpy as np
A = np.array([[2., 3.],[-1., -2.]])
e = np.ones(2)
print(A)
print(e)
B = np.hstack((A,e.reshape((2,1)))) 
print(B)

完全符合我的要求。但有没有办法避免这种笨拙的重塑使用?

4 个答案:

答案 0 :(得分:2)

如果您想避免使用reshape,则必须附加正确尺寸的列:

e = np.ones((2, 1))
B = np.hstack((A,e))

请注意对ones的调用的修改。你现在必须使用重塑的原因是numpy并不认为维度2的数组与维度(2,1)的数组相同。第二个是2D数组,其中一个维度的大小为1

答案 1 :(得分:1)

我直接解决方案的提名是

np.concatenate((A, e[:, None]), axis=1)

[:,None]e变成(2,1),可以连接到(2,2)以产生(2,3)。重塑也是如此,但在语法上并不漂亮。

使用hstackvstackc_的解决方案做同样的事情,但隐藏了一个或多个细节。

在这种情况下,我认为column_stack隐藏了最多的细节。

np.column_stack((A, e))

在幕后,这样做:

np.concatenate((A, np.array(e, copy=False, ndmin=2).T), axis=1)

np.array(... ndmin=2).T是进行重塑的另一种方式。

答案 2 :(得分:1)

有很多解决方案。我喜欢np.c_将1d输入视为列(因此c),从而产生简洁,无杂乱,易于阅读的内容:

np.c_[A, e]
# array([[ 2.,  3.,  1.],
#        [-1., -2.,  1.]])

答案 3 :(得分:0)

正如Tim B所说,hstack你需要一个(2,1)数组。或者(将e保持为一维数组),vstack到转置,然后进行转置:

In [11]: np.vstack((A.T, e)).T
Out[11]: 
array([[ 2.,  3.,  1.],
       [-1., -2.,  1.]])