2017-03-08 72 views
2

我已经见过其他人发帖,但是如果有更好的解决方案,我不清楚。我有一个2D NumPy数组,我想在它后面添加一列。例如:在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) 

确实是我想要的。但是有没有办法避免这种笨重的重塑?

+0

你想要一个有效的解决方案,还是一个只是隐藏所有的细节?是什么让解决方案“更好”?任务是连接一个(2,2)和(2,)以产生一个(2,3),对吗? – hpaulj

回答

2

如果你想避免使用reshape,那么你必须要追加正确尺寸的柱:

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

注意修改调用ones。你现在不得不使用重塑的原因是numpy不认为维2的数组与维(2,1)的数组相同。第二个是尺寸为1的二维数组。

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.]]) 
1

我一个直接的解决方案提名

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

[:,None]变成e成(2,1)可以连接到(2,2)以产生(2,3)。重塑相同,但不是语法上的漂亮。

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

在这种情况下,我认为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尚未做重塑另一种方式。

1

有很多解决方案。我想造成np.c_它把1D输入栏目(因此c)以简洁,杂波免费的,易于阅读:

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