Python、機械学習

【Python】Numpyにおける、np.arrayとnp.asarrayの違い

PythonのNumpyでは、np.arrayとnp.asarrayという似た書き方が出てきます。

混乱しないように、違いを簡単に説明します。

リストをNumpy配列に変換する場合

こちらのリストを使って説明します。ドラえもんに出てくる、出来杉くんの各教科のテスト結果です。

import numpy as np

# ドラえもんの出木杉くんのテストの点
dekisugi = [95, 100, 97, 94, 98]
dekisugi

[95, 100, 97, 94, 98]

リストをNumpy配列に変換する場合は、np.arrayとnp.asarrayに違いはありません。

どちらを使っても、同じようにリストをNumpy配列に変換できます。

np.arrayで変換した場合

# 出木杉くんのテストの点数をリストからNumpy配列に変換する
dekisugi_arr = np.array(dekisugi)
dekisugi_arr

array([ 95, 100, 97, 94, 98])

np.asarrayで変換した場合

# 出木杉くんのテストの点数をリストからNumpy配列に変換する
dekisugi_arr = np.asarray(dekisugi)
dekisugi_arr

array([ 95, 100, 97, 94, 98])

Numpy配列をNumpy配列に変換する場合

Numpy配列をNumpy配列に変換するって、ちょっと意味がわからないと思いますが、一応こういう変換ができます。

とりあえず例で見てみましょう。

ここでは、しずかちゃんもテストを受けて出木杉くんと同じ点数を取ったとします。

そして、出木杉くんのNumpy配列を使って、しずかちゃんのNumpy配列を作ってみることとします。

np.arrayで変換した場合

np.arrayを使って生成したしずかちゃんは、出木杉くんとは別人として扱われます。別人格ということです。

例えば、しずかちゃんを生成した後に、出木杉くんのテストの点数を変更しても、しずかちゃんのテストの点数は変わりません。

# 出木杉くんと同じ点数のしずかちゃんを生成する
sizuka_arr = np.array(dekisugi_arr)

dekisugi_arr[0] = 1

dekisugi_arr, sizuka_arr

(array([ 1, 100, 97, 94, 98]), array([ 95, 100, 97, 94, 98]))

np.asarrayで変換した場合

ところが、np.asarrayを使って生成したしずかちゃんは、出木杉くんと同一人物として扱われます。しずかちゃんという名前をつけたにも関わらずです。

したがって、しずかちゃんを生成した後に出木杉くんのテストの点数を変更すると、しずかちゃんのテストの点数も変更されるわけです。

# 出木杉くんと同じ点数のしずかちゃんを生成する
sizuka_arr = np.asarray(dekisugi_arr)

dekisugi_arr[0] = 1

dekisugi_arr, sizuka_arr

(array([ 1, 100, 97, 94, 98]), array([ 1, 100, 97, 94, 98]))

まとめると

・リストをNumpy配列に変換する場合は、np.array、np.asarrayどっちでも良い。

・Numpy配列のコピーを作る場合は、np.arrayを使う。
・元のNumpy配列と同期され続けるコピーを作る場合は、np.asarrayを使う。