2016-12-25 247 views
2
import numpy 

...... 

# Prediction 
predictions = model.predict(X_test) 
# round predictions 
rounded = [round(x) for x in predictions] 
print(rounded) 

"predictions" is a list of decimals between [0,1] with sigmoid output. 

をなぜそれは常にこのエラーを報告しない:エラー「TypeError例外:タイプnumpy.ndarrayは__round__メソッドを定義していない」

File "/home/abigail/workspace/ml/src/network.py", line 41, in <listcomp> 
    rounded = [round(x) for x in predictions] 
TypeError: type numpy.ndarray doesn't define __round__ method 

i「は丸い」を使用しない場合、それは小数を印刷します正しくこの「丸め」は、Python組み込み関数でなければなりません。なぜそれは何がnumpyと関係がありますか?

編集:

for x in predictions: 
    print(x, end=' ') 

出力は、次のとおりです。あなたが値を格納するためにNumpyを使用する関数を使用している

[ 0.79361773] [ 0.10443521] [ 0.90862566] [ 0.10312044] [ 0.80714297] 
[ 0.23282401] [ 0.1730803] [ 0.55674052] [ 0.94095331] [ 0.11699325] 
[ 0.1609294] 
+0

である私は、 'predictions'はおそらく、2D配列だと思います形状(11,1)を有する。 – hpaulj

答えて

2

modelとは何ですか?どのモジュールからですか? predictionsは2次元配列です。 predictions.shapeとは何ですか?このエラーは[x for x in predictions]xが配列であることを示します。これは単一要素の配列でも構いませんが、それほど配列ではありません。 [x.shape for x in predictions]を試して、predictionsの各要素(行)の形状を確認することができます。

私は(__add__から+代表者など多くの).__round__メソッドにアクションをroundを使用するための多くの機会があったが、明らかにPythonの機能を委譲していません。

In [932]: round? 
Docstring: 
round(number[, ndigits]) -> number 

Round a number to a given precision in decimal digits (default 0 digits). 
This returns an int when called with one argument, otherwise the 
same type as the number. ndigits may be negative. 
Type:  builtin_function_or_method 
In [933]: x=12.34 
In [934]: x.__round__? 
Docstring: 
Return the Integral closest to x, rounding half toward even. 
When an argument is passed, work like built-in round(x, ndigits). 
Type:  builtin_function_or_method 
In [935]: y=12 
In [936]: y.__round__? 
Docstring: 
Rounding an Integral returns itself. 
Rounding with an ndigits argument also returns an integer. 
Type:  builtin_function_or_method 

Pythonの整数は、Pythonの浮動小数点数とは異なる実装です。

Pythonのリストと文字列にはこの定義がありません。round([1,2,3])AttributeError: 'list' object has no attribute '__round__'を返します。

ndarrayと同じです。しかし、numpynp.round関数を定義し、numpy配列は.roundメソッドを持っています。

In [942]: np.array([1.23,3,34.34]).round() 
Out[942]: array([ 1., 3., 34.]) 
In [943]: np.round(np.array([1.23,3,34.34])) 
Out[943]: array([ 1., 3., 34.]) 

help(np.around)は、numpyバージョンの完全なドキュメントを提供します。私はあなたのようpredictionsの一部を再構築することができ、あなたの最後の印刷から

===================

In [955]: arr = np.array([[ 0.79361773], [ 0.10443521], [ 0.90862566]]) 
In [956]: arr 
Out[956]: 
array([[ 0.79361773], 
     [ 0.10443521], 
     [ 0.90862566]]) 
In [957]: for x in arr: 
    ...:  print(x, end=' ') 
    ...:  
[ 0.79361773] [ 0.10443521] [ 0.90862566] 

arr.shape(3,1)です - 1列の2次元配列。

np.roundは、反復を必要とせず、正常に動作します:

In [958]: np.round(arr) 
Out[958]: 
array([[ 1.], 
     [ 0.], 
     [ 1.]]) 

反復はあなたのエラーを生成します。

In [959]: [round(x) for x in arr]  
TypeError: type numpy.ndarray doesn't define __round__ method 
+0

まずこれを読ませてください。 – user697911

1

。通常のPythonリストではなく、実際にはNumpyの配列です。これは一般に、機械学習では、Numpyは、Pythonの普通のリストと比較して膨大な量のデータを保存する上で非常に優れた仕事をするからです。あなたは、あなたが理解をプリフォームすることができ、通常のリストに変換するには、次のドキュメントを参照してくださいすることができます

https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.tolist.html

編集:あなたがしようとした場合

何が起こる:

for x in predictions: 
    for y in x.: 
    print(y, end=' ') 
+0

「x」は単一の数値です。 – user697911

+0

私の追加をご覧ください。 – user697911

+0

@ user697911 numpyはリストのリストを作成する奇妙な方法を持っているので、私のコメントを参照してください。これは実質的にラウンドできるように値をアンラップする必要があります。 – rb612

2

TypeError: type numpy.ndarray doesn't define round method

numpy.ndarrayにラウンドを適用しようとしました。明らかに、これはサポートされていません。

numpy.roundを使用し、これを試してみてください:

rounded = [numpy.round(x) for x in predictions] 

xがnumpyの配列です。これを試すこともできます:

rounded = [round(y) for y in x for x in predictions] 
+0

しかし、配列ではない1つの10進数 'x'に 'round'は適用されませんか? – user697911

+0

xは小数点以下1桁ですか?それを証明するためにそれを印刷してください。 – gzc

+0

"predictions"は数値が小さい配列ですが、 'x'は単一の値です。 – user697911

0

Kerasのチュートリアルを試していたときに同じエラーが発生しました。まず

は、私は

rounded = [numpy.round(x) for x in predictions] 

を試みたが、それは、このような結果を示した:

[array([1.], dtype=float32), array([0.],dtype=float32), ...] 

私はこの試み:

rounded = [float(numpy.round(x)) for x in predictions] 

それが正しい出力を示しました。

"numpy.round(x)"はndarrayのリストを返し、dtypeパラメータを含んでいると思います。値は正しい出力です。したがって、リストの各要素をfloat型に変換すると、チュートリアルと同じように正しい出力が表示されます。

私のマシンはLinuxのミント17.3(Ubuntuの14.04)のx64で、Pythonインタプリタは、Python 3.5.2、anaconda3(4.1.1)、numpyの1.11.2

+0

いくつかの説明をお願いできますか? – thumbtackthief

関連する問題