numpyのarrayとasarrayの違いと使いどころ[自分用メモ]

前置き

題名の通り、自分用メモ。 他のブログ記事などは、reference等を適当にまとめてるだけな印象。 結局何なのか曖昧だったので現状の理解をざっくりまとめる。

arrayとasarrayの共通点

引数にndarray以外の配列が来たら、ndarrayを返す。引数と戻り値は別物。

つまり

import numpy as np

a = [0,1,2]

b = np.array(a)
c = np.asarray(a)

a[0] = 100

print(a)
print(b)
print(c)

出力結果

[100, 1, 2]
[0 1 2]
[0 1 2]

arrayとasarrayの相違点

引数がndarrayの時、arrayなら新しいndarrayを返し、asarrayなら参照オブジェクトを返す。

つまり

import numpy as np

a = np.array([0,1,2])

b = np.array(a)
c = np.asarray(a)

a[0] = 100

print(a)
print(b)
print(c)

出力結果

[100   1   2]
[0 1 2]
[100   1   2]

cはaの参照なので、aの中身が変わればcも同様に変わる。

使いどころ

個人的に思いついたのは、例えば任意の関数で中身の処理自体はndarrayで行うが、引数自体はlistでもtupleでもndarraryでもOKにしたい場合。 asarrayを使えば、arrayに比べて新しいndarray分のメモリを増やす必要がなく、少しメモリを節約できる?

例えば、こんな感じですかね。

import numpy as np

a = np.array([0,1,2]) # listでもtupleでもOK

def mean(x):
    x = np.asarray(x) # aがlist等ならndarrayになおす。arrayの場合、新しいadrrayを生成するが、          
                      # asarrayの場合、参照を返すのでndaray余分に生成しない分メモリ節約

    return x.mean()

他にも使い所あったり、誤りがあればコメント等で共有してください。