2014-02-08 54 views
2

我正在嘗試將列添加到numpy數組中。每行目前有四個值,我希望每行有五個值。下面是一個可重複的例子,返回ValueError: all the input arrays must have same number of dimensions我不明白爲什麼我會得到錯誤,因爲Y的長度與X的長度相同,就像b的長度與documentation中的a長度一樣。最終,我希望以最有效的方式將像Y這樣的數組添加到像X這樣的現有數組中作爲每行的新列。將新列/數組添加到Numpy數組中

import numpy as np 
from sklearn import datasets 

#Documentation 
a = np.array([[1, 2], [3, 4]]) 
b = np.array([[5, 6]]) 
c = np.concatenate((a, b.T), axis=1) 
print(c) 

#My Case 
iris = datasets.load_iris() 
X = iris.data 
Y = iris.target 
Z = np.concatenate((X, Y.T), axis = 1) #Is transpose necessary for single dimension array? Throws error either way 
print(Z) 

編輯:我要補充一點,在實踐中我將與從sklearn預測從模型的擬合值來工作。所以我特別感興趣的是將預測值添加到現有數組(如X)的最有效方法,即sklearn使用的格式。下面的解決方案來自M4rtini的評論,我認爲這相當於Dietrich的解決方案之一。這是最快的實施?

#My Case 
import numpy as np 
from sklearn import datasets 
from sklearn.linear_model import LinearRegression 

iris = datasets.load_iris() 
X = iris.data 
Y = iris.target 
model = LinearRegression() 
model.fit(X,Y) 
y_hat = model.predict(X).reshape(-1,1) 
Z = np.concatenate((X, y_hat), axis = 1) 
+2

嘗試'Y.reshape(-1,1)'而不是'Y.T'。如果沒有第二維轉置它不會做任何事情。 – M4rtini

回答

1

爲了確保您的尺寸相符,請嘗試:

Z = np.vstack((X.T,Y)).T 

Yr = np.reshape(Y, (len(Y),1)) 
Z = np.hstack((X,Yr)) 

因爲

X.shape = (150, 4) 
Y.shape = (150,) 
Yr.shape = (150,1) 
Z.shape = (150,5) 
+0

重塑或換位會更快嗎?它們各自對內存使用有什麼影響? – Michael

+0

@邁克爾:轉換將更快,需要更少的內存,因爲數組不重複。使用M4rtini的解決方案''Y.reshape(-1,1)''效率可能與''Y.T''不一樣 – Dietrich

2

注意b是一個二維數組:

In [1848]: b = np.array([[5, 6]]) 

In [1849]: b.shape 
Out[1849]: (1, 2) 

Y.T不會使Y 2D陣列:

In [1856]: Y 
Out[1856]: array([0, 1, 2, 3]) 

In [1857]: Y.T 
Out[1857]: array([0, 1, 2, 3]) 

In [1858]: Y.T.shape 
Out[1858]: (4,) 

使Y 2D陣列:

In [1867]: Y1=Y.reshape(-1, 1) 

In [1868]: Y1 
Out[1868]: 
array([[0], 
     [1], 
     [2], 
     [3]]) 

In [1869]: Y2=Y.reshape(1, -1) 

In [1870]: Y2 
Out[1870]: array([[0, 1, 2, 3]]) 

,或使用np.newaxis

In [1872]: Y3 
Out[1872]: 
array([[0], 
     [1], 
     [2], 
     [3]]) 

In [1873]: Y4=Y[np.newaxis, :] 

In [1874]: Y4 
Out[1874]: array([[0, 1, 2, 3]])