« マスクがもう無くなるので楽天で100枚入りのを昨日の夜注文したら今日の午前中に届いた。 | トップページ | 吉野家でスタミナ超特盛丼を食す。確かに肉(牛、豚、鶏)だらけででかい、のとマヨネーズとにんにくがジャンキーな味にしている。 »

2020年5月 8日 (金)

PythonのNumpyのNdarrayで、関数の引数で行列を渡して、その関数の中で代入すると値が変わってこないことにハマった。def f(x,y): y=x みたいな。y[...]=xとかy[:,:]=xとかy[:]=xで予期した効果になった。

Pythonは本当に電卓的とかグラフ表示とかScikit-RFで高周波の簡単な解析しかしてこなかった初心者なのですが、、、

ちょっとプログラムを組んでみようかと思ってハマった話です。

Numpyで2次元の行列、例えばx,yがあって、ある関数fを定義してx,yを引数にとってfの中でy=xの何か複雑な式

をしようとしておかしくなった。簡単な例として

def f(x,y):
    y=x

とかしておいて

x=np.zeros((3,3))
y=np.eye(3)

f(x,y)

とするとyが0行列になってほしいじゃないですか。参照渡しなんだから。

でも結果はそのまま渡す前とidも同じで

[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]

あれ?と思って調べたら(というかおそらく簡単な話なので逆に調べ方がわからなくて苦労、、、)、

関数の中で配列そのもの(要素ではなくて)に代入してしまうと、別の配列になってしまって

引数が変更されていない様子。

こういう時は参照渡しで受け取った行列をそのまま返すというのが必要で、

(要素ごとに変えるようなもの)

def f(x,y):
    y[...]=x

とか、

※三点リーダーはhttps://qiita.com/yubessy/items/cc1ca4dbc3161f84285e Ellipsistというらしい。

 配列の全要素を表す。

def f(x,y):
    y[:,:]=x

か、後ろの:が省略できるので

def f(x,y):
    y[:]=x

とすると、idも変わらず

[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]

とできた。

まあこれはいいのだが、、、逆パターンの

y=x[:]

はリストとNumpyの配列で振る舞いが違うとか、、、Pythonはなかなかよくわからん、、、

https://deepage.net/features/numpy-copyview.html

« マスクがもう無くなるので楽天で100枚入りのを昨日の夜注文したら今日の午前中に届いた。 | トップページ | 吉野家でスタミナ超特盛丼を食す。確かに肉(牛、豚、鶏)だらけででかい、のとマヨネーズとにんにくがジャンキーな味にしている。 »

日記・コラム・つぶやき」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« マスクがもう無くなるので楽天で100枚入りのを昨日の夜注文したら今日の午前中に届いた。 | トップページ | 吉野家でスタミナ超特盛丼を食す。確かに肉(牛、豚、鶏)だらけででかい、のとマヨネーズとにんにくがジャンキーな味にしている。 »

最近の記事

2021年2月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28            
フォト
無料ブログはココログ