リストまたはnumpy配列を受け入れることができる関数があります。
いずれの場合も、リスト/配列には単一の要素が常にあります。私はただフロートを返す必要があります。
だから、例えば、私は受け取ることができました:
list_ = [4]
またはnumpy配列:
array_ = array([4])
そして私は戻るべきです
4.0
したがって、当然(私は言う)、list_でfloat(...)を使用して取得します。
TypeError: float() argument must be a string or a number
Array_にも同じことをしますが、今回は「4.0」で応答することで動作します。これから、Pythonのリストをこの方法で浮動小数点数に変換できないことを学びました。
Numpy配列のfloatへの変換の成功に基づいて、これがアプローチにつながりました。
float(np.asarray(list_))
これは、list_がPythonリストであり、numpy配列である場合に機能します。
質問
しかし、このアプローチには、最初にリストをnumpy配列に変換してからフロートに変換するオーバーヘッドがあるようです。基本的に、これを行うより良い方法はありますか?
インデックスアクセスとインデックス0を使用して、リスト/配列の最初の項目にアクセスするだけです。
_>>> list_ = [4]
>>> list_[0]
4
>>> array_ = np.array([4])
>>> array_[0]
4
_
これは最初に挿入したものであるため、int
になります。何らかの理由でフロートにする必要がある場合は、その上でfloat()
を呼び出すことができます:
_>>> float(list_[0])
4.0
_
a.item()
のように、 _ndarray.item
_ メソッドを使用することもできます。これは np.asscalar(a)
と同等です。これには、ビューと余分な軸がある状況で作業するという利点がありますが、上記の解決策は現在中断されます。例えば、
_>>> a = np.asarray(1).view()
>>> a.item() # correct
1
>>> a[0] # breaks
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: too many indices for array
>>> a = np.asarray([[2]])
>>> a.item() # correct
2
>>> a[0] # bad result
array([2])
_
これには、配列がシングルトンでない場合に例外をスローするという利点もありますが、_a[0]
_アプローチは静かに進行します(これにより、検出されないバグが潜入する可能性があります)。
_>>> a = np.asarray([1, 2])
>>> a[0] # silently proceeds
1
>>> a.item() # detects incorrect size
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: can only convert an array of size 1 to a Python scalar
_
numpy.asscalar を使用して、numpy配列/行列をスカラー値に変換します。
>>> a=numpy.array([[[[42]]]])
>>> numpy.asscalar(a)
42
出力データ型は、入力の
item
メソッドによって返されるのと同じ型です。
複数の要素がある場合、エラーチェックが組み込まれています。
>>> a=numpy.array([1, 2])
>>> numpy.asscalar(a)
与える:
ValueError: can only convert an array of size 1 to a Python scalar
注:asscalar
に渡されるオブジェクトはitem
に応答する必要があるため、リストまたはTupleを渡すことはできません。
単純に使用しますが、
np.asarray(input, dtype=np.float)[0]
input
が正しいdtypeのndarray
である場合、np.asarray
はこの場合何もしません。input
がlist
の場合、np.asarray
は、出力が正しいタイプであることを確認します。