2016-12-02 86 views
1

這種失敗:爲什麼「assert 211 == 211」失敗?

train_data = pd.concat([train_cancelled, train_not_cancelled]).as_matrix() 

mat_col_size = int((num_days * 3) + 1) 

assert isinstance(mat_col_size, int), "mat_col_size is not an int" 
assert isinstance(train_data.shape[1], int), "train_data.shape[1] is not an int" 

assert train_data.shape[1] == mat_col_size, \ 
    "Number of columns in train data must be 'num_fetaures + 1 = {0:d}' (label) but is '{0:1}'." \ 
     .format(mat_col_size, train_data.shape[1]) 

它會打印:

AssertionError: Number of columns in train data must be 'num_fetaures + 1 = 211' (label) but is '211'. 

我的問題是:不同的東西有多少可以去錯了,導致此操作失敗,因爲我根本就沒有找到問題或爲什麼我的代碼不會使第三個assert

+1

你能發表一個訓練數據的例子嗎?也許所有的colums,但至少只有幾行 – shadowtalker

+2

,你能告訴我們'type(train_data.shape [1])'的輸出嗎?它可能有類型'numpy.int64'而不是'int' – shadowtalker

+0

它的價值,我不能用'assert pd.DataFrame([[1,2,3],[4,5,6]])重現.as_matrix()。shape [1] == 3' – shadowtalker

回答

6

您的格式字符串通過使用位置選擇器0兩次選擇第一個參數兩次。您實際上沒有看到train_data.shape[1]的值,它在兩種情況下都會打印mat_col_size的值。我想你的意思是:

"Number of columns in train data must be 'num_fetaures + 1 = {0:d}' (label) but is '{1}'." 

,或者假設它是PY 2.7+,你可以簡化爲只:

"Number of columns in train data must be 'num_fetaures + 1 = {}' (label) but is '{}'." 

,能夠自動匹配的佔位符的位置參數沒有明確指定號碼(有是沒有理由指定d格式單元;它不是printf,它會自行串聯)。

+0

* facepalm * .... – displayname

+0

@displayname:你至少提出了一個有趣的命中,當你認爲你只是提供了連續的位置參數時,乍看之下「{0:1}」很容易被錯誤地讀取。碰巧,它實際上只是填充一個將空字符串格式化爲單個空格的參數(並且保留所有其他參數不變),但它比最簡單的情況更微妙。這種問題是爲什麼我總是避免編號我的位置格式單位,除非我真的需要重用一個單位。 – ShadowRanger

+0

我想我會爲未來記住這一點:D但是最糟糕的事情是一段時間編程之後的簡單失明。 – displayname