2017-03-08 34 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.]])