NumPy配列をネイティブのPythonリストに変換するには、ndarray.tolist
を使用することをお勧めします。NumPy構造化配列の真に再帰的な `tolist()`
ああ、構造化配列を使用している場合、これは再帰的には機能していないようです。確かに、いくつかのndarray
オブジェクトは結果のリストで参照されている、未変換:
>>> dtype = numpy.dtype([('position', numpy.int32, 3)])
>>> values = [([1, 2, 3],)]
>>> a = numpy.array(values, dtype=dtype)
>>> a.tolist()
[(array([1, 2, 3], dtype=int32),)]
私はこの問題を回避するために簡単な関数を書いた:使用された場合
def array_to_list(array):
if isinstance(array, numpy.ndarray):
return array_to_list(array.tolist())
elif isinstance(array, list):
return [array_to_list(item) for item in array]
elif isinstance(array, tuple):
return tuple(array_to_list(item) for item in array)
else:
return array
、期待される結果を提供します、:
>>> array_to_list(a) == values
True
この機能に伴う問題は、それが出力する各リスト/タプルを再作成することによってndarray.tolist
のジョブを複製することです。最適ではありません。
だから、質問は以下のとおりです。
- が予想さ
ndarray.tolist
のこの行動のですか? - これを行うには良い方法がありますか?
構造化された配列は、リストのリストよりもリストの値のほうが意味があります(またはその逆)。 – Evert
Dictは構造化された配列のフィールドがdtype内で順序付きリストとして定義されているので、確かに実際には意味がありますがリストのリストもそうです。その上、NumPyは配列を初期化するために使われる 'values'変数を理解しています。非dict形式で定義されていますが、リストは確かに有効な構造体です。 – ChristopherC