私が理解していることから、NumPy 配列をネイティブ Python リストに変換する推奨される方法は、ndarray.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
予期されるものですか? - これを実現するためのより良い方法はありますか?