【Pythonデータ分析】リストとNumPy配列の相互変換

この記事では、NumPyについて学習する中で、私が個人的にややこしいと感じた点を紹介します。Pythonを初めて学ぶ方にとって、参考になれば幸いです。結論から言うと、NumPy配列をPythonの標準リストに変換するときは、list()ではなくtolist()を使うことをおすすめします。具体的なコードを以下で紹介します。

リストをNumPy配列へ変換

まず、Pythonの標準リストlistからNumPy配列ndarrayへの変換は、numpy.array()を使います。
numpy.array — NumPy v2.2 Manual

import numpy as np

list_1d = [1, 2, 3]
print(list_1d)
# [1, 2, 3]

array_1d = np.array(list_1d)
print(array_1d)
# [1 2 3]

2次元以上の場合でも同様の方法で変換できます。

list_2d = [[1, 2, 3], [4, 5, 6]]
print(list_2d)
# [[1, 2, 3], [4, 5, 6]]

array_2d = np.array(list_2d)
print(array_2d)
# [[1 2 3]
#  [4 5 6]]

NumPy配列をリストへ変換

次に、NumPy配列ndarrayからlistへの変換はndarray.tolist()を使います。
numpy.ndarray.tolist — NumPy v2.2 Manual

array_1d = np.array([9, 8, 7])
print(array_1d)
# [9 8 7]

list_1d = array_1d .tolist()
print(list_1d)
# [9, 8, 7]

先ほどと同じく、2次元以上の場合でも同様の方法で変換できます。

array_2d = np.array([[9, 8, 7], [6, 5, 4]])
print(array_2d)
# [[9 8 7]
#  [6 5 4]]

list_2d = array_2d .tolist()
print(list_2d)
# [[9, 8, 7], [6, 5, 4]]

tolist()ではなくlist()を使用した場合

では、NumPy配列ndarrayからlistへの変換をndarray.tolist()ではなく、Pythonの組み込み関数であるlist()で行うとどうなるでしょうか。
組み込み関数 — Python 3.13.3 ドキュメント

array_1d = np.array([9, 8, 7])
print(array_1d)
# [9 8 7]

list_1d = list(array_1d)
print(list_1d)
# [9, 8, 7]

上記のように、1次元配列では問題なく変換できます。しかし、2次元配列の場合、以下の例に示すように、期待どおりの挙動にならないため注意が必要です。

array_2d = np.array([[9, 8, 7], [6, 5, 4]])
print(array_2d)
# [[9 8 7]
#  [6 5 4]]

list_2d = list(array_2d)
print(list_2d)
# [array([9, 8, 7]), array([6, 5, 4])] # ndarrayの2次元目がlistに変換されていない

まとめ

  • ndarray.tolist(): ndarray再帰的にlistに変換する
  • list(ndarray): ndarray1次元目のみをlistに変換する

この違いがあるため、NumPy配列をリストに変換する際には、ndarray.tolist()を使用することが推奨されています。