質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

8277閲覧

numpy nditerの引数 op_flags["readwrite"]とは?

退会済みユーザー

退会済みユーザー

総合スコア0

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2017/06/09 16:16

python

1def numerical_gradient(f, x): 2 h = 1e-4 # 0.0001 3 grad = np.zeros_like(x) 4 5it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite']) 6 7 while not it.finished: 8 idx = it.multi_index 9 tmp_val = x[idx] 10 x[idx] = float(tmp_val) + h 11 fxh1 = f(x) # f(x+h) 12 13 x[idx] = tmp_val - h 14 fxh2 = f(x) # f(x-h) 15 grad[idx] = (fxh1 - fxh2) / (2*h) 16 17 x[idx] = tmp_val # 値を元に戻す 18 it.iternext() 19 20 return grad

ゼロから作るディープラーニングの
commonの中にある gradient.pyの関数numerical_gradienのコードです
https://github.com/oreilly-japan/deep-learning-from-scratch

このコードの大体の動作は、
http://www.aipacommander.com/entry/2017/05/14/172220
此方のサイトのおかげで理解することが出来たのですが、
以下の部分のop_flags=['readwrite']が何をしているのががわかりません

python

1it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])

これは何をしているのか、詳しいかたいればお願いします><

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下が参考になります。
Modifying Array Values

forループなどでイテレータで要素に参照する場合の要素への読み書きモードを指定するようです。

ただし提示されたコードではx[idx]のように元配列xをイテレータで取得した添え字idxで参照していますが、この場合はイテレータがreadonlyでも要素の書き換えはできるようです。

Python

1import numpy as np 2 3# イテレータで要素を書き換え readwriteが必要 4a = np.arange(6).reshape(2,3) 5it = np.nditer( a, flags=['multi_index'], op_flags=['readwrite']) 6for x in it: 7 # To actually modify the element of the array, 8 # x should be indexed with the ellipsis. 9 x[...] = x * 2 10print(a) 11 12# 要素を添え字で参照して要素を書き換え イテレータはreadonlyでもよいようだ 13a = np.arange(6).reshape(2,3) 14it = np.nditer( a, flags=['multi_index'], op_flags=['readonly']) 15while not it.finished: 16 a[it.multi_index] = a[it.multi_index] * 2 # # 要素を添え字で参照 17 it.iternext() 18print(a) 19 20# イテレータで要素を書き換え readonlyでは不可 21a = np.arange(6).reshape(2,3) 22it = np.nditer( a, flags=['multi_index'], op_flags=['readonly']) 23for x in it: 24 x[...] = x * 2 # assignment destination is read-only 25print(a)
[[ 0 2 4] [ 6 8 10]] [[ 0 2 4] [ 6 8 10]] (assignment destination is read-only例外が発生)

投稿2017/06/10 03:24

can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/06/10 04:56

いつもありがとうございます! x[...]という書き方が見慣れないのでなんだろうと思ったら、イテレーションする変数の要素までも書き換えるという事なんですね x = x * 2 はイテレーションする変数の要素までは書き換えないのでそこが違うと そしてそれをする際に、readwriteが必要になってくると もう一つ聞きたいのですが、readonlyという事は、引数を省略しても問題はないという認識で合っているでしょうか? 試しにwhile not のイテレーションのコードで op_flagsを省略したら問題なく動作したので
can110

2017/06/11 23:58

詳細な動作仕様は把握できていないのですが、結果からするとwhile not の例ではイテレータのモードに関係なく要素の値を書き換えられますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問