1. ホーム
  2. python

[解決済み] エラー "TypeError: type numpy.ndarray doesn't define __round__ method"

2022-02-14 17:40:40

質問

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. 

なぜいつもこのエラーを報告するのですか。

  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

round'を使用しない場合、小数点以下は正しく表示されます。この "round" は Python の組み込み関数であるべきです。なぜnumpyと関係があるのですか?

編集しました。

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

と出力されます。

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

解決方法は?

とは何ですか? model ? どのモジュールから? これは、以下のように見えます。 predictions は2次元配列です。 とは predictions.shape ? このエラーでは x[x for x in predictions] は配列です。 単一要素の配列であっても、配列であることに変わりはありません。 試しに [x.shape for x in predictions] の各要素(行)の形状を見ることができます。 predictions .

を使う機会はあまりないのですが round しかし、明らかにPythonの関数は、そのアクションを .__round__ メソッドと同じように + に委ねる。 __add__ ).

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 . しかし numpy が定義されています。 np.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