2016-11-09 81 views
0

我現在有點迷路了。我正確初始化一個空numpy的陣列,我相信我使用np.append功能正常for循環中追加numpy數組的問題

Preds = np.empty(shape = (X_test.shape[0],10)) 

kf = KFold(n = X_train.shape[0], n_folds=10, shuffle = True) 

for kf_train, kf_test in kf: 

    X_train_kf = X_train.iloc[kf_train] 
    Y_train_kf = Y_train.iloc[kf_train] 

    dt = tree.DecisionTreeClassifier(max_depth=2) 
    dt.fit(X_train_kf, Y_train_kf) 
    Preds = np.append(Preds,dt.predict(X_test)) 

    print Preds 

只是一些額外的信息:

  • X_test具有的形狀(9649,24)

  • (後運行)Preds具有的形狀(192980)

在這個循環中,Preds的形狀應該是(9649,10)

任何建議將不勝感激。

編輯:這裏是更新的解決方案

Preds = [] 
kf = KFold(n = X_train.shape[0], n_folds=20, shuffle = True) 

for kf_train, kf_test in kf: 

    X_train_kf = X_train.iloc[kf_train] 
    Y_train_kf = Y_train.iloc[kf_train] 

    dt = tree.DecisionTreeClassifier(max_depth=2) 
    dt.fit(X_train_kf, Y_train_kf) 
    Preds.append(dt.predict(X_test)) 

Preds = np.vstack(Preds) 
+0

來自numpy.append文檔:'axis:int,可選 值附加的軸。如果未指定軸,則在使用' –

+0

之前,arr和值都會變平並且是否檢查了dt.predict(X_test)的形狀? –

+0

最好避免使用append。相反,只需將每個數組添加到python列表中,然後使用np.vstack或np.hstack將它們平鋪到單個數組中。 – Erotemic

回答

0

如果Preds是(9649,10),那麼你可以做2種級聯的一個

newPreds = np.concatenate((Preds, np.zeros((N,10))), axis=0) 
newPreds = np.concatenate((Preds, np.zeros((9649,N)), axis=1) 

第一個產生(9649 + N,10)陣列,第二個(9646,10 + N)。

np.vstack可用於使第二陣列爲2d,即它將(10,)更改爲(1,10)陣列。 np.append需要2個參數而不是一個列表,並確保第二個是一個數組。向1d數組添加標量比通用連接更好。

確保您瞭解陣列的形狀和尺寸數量。

一個很好的選擇是將追加到列表

alist = [] 
alist.append(initial_array) 
for ... 
    alist.append(next_array) 
result = np.concatenate(alist, axis=?) 
# vstack, stack, and np.array can be used if dimensions are right 

追加到列表中,然後加入一個在到底是不是重複符連接速度更快。列表旨在便宜地增長;數組通過創建一個更大的數組而增長。