2016-12-02 1 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'. 

私の質問です:私は単に問題や見つからないので、物事がうまくいかないと、これが失敗する可能性がありますどのように多くの異なります理由は私のコードは、3番目を作ることはありませんassert

+1

トレーニングデータの例を投稿できますか?おそらくすべての列で、ただ少数の行 – shadowtalker

+2

で、 'type(train_data.shape [1])'の出力を表示できますか?それは 'int'の代わりに' numpy.int64'を持っているかもしれません – shadowtalker

+0

それは価値があるため、私は 'assert pd.DataFrame([[1,2,3]、[4,5,6]]で再現できません) .as_matrix()。shape [1] == 3' – shadowtalker

答えて

6

フォーマット文字列では、位置セレクタ0を2回使用して最初の引数を2回選択しています。実際にはtrain_data.shape[1]という値は表示されていませんが、どちらの場合もmat_col_sizeという値が表示されます。それは自動的に明示的に番号を指定せずに、位置引数にプレースホルダを一致することができ

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

(およびそこ:

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

か、それはPyの2.7以降だと仮定すると、あなただけに簡素化することができます:私はあなたが意味を考えますdフォーマットユニットを指定する理由はありませんが、それはprintfではないため、それ自体で文字列化します)。

+0

* facepalm * ...よりも厳しい型チェックもあります。 – displayname

+0

@displayname:少なくともあなた面白いヒットが出てきました。一見したところで '{0:1}'は、あなたがちょうど連続的な位置引数を提供していると仮定すると、間違って読み込まれることがありました。実際には、空の文字列を単一のスペースにフォーマットする(他のすべての引数は変更しないでください)という形式の引数を埋め込むだけですが、最も単純な場合よりも微妙です。この種の問題は、なぜ私が実際に再利用する必要がないかぎり、常に私の位置指定フォーマットユニットの番号付けを避ける理由です。 – ShadowRanger

+0

私は未来のことを念頭に置いておくつもりだと思います。しかし、最も邪悪なことは単純な失明です。 – displayname

関連する問題