PythonのNumPyの行列の書き換えを禁止したり許可したりする
Pythonで使うNumPyのndarrayは、オブジェクトのプロパティを設定することで、書き換えを許可したり禁止したりできます。
目次
numpy.ndarray.flagsプロパティとは
ndarrayオブジェクトを作ると、そのndarrayの情報を表すflagsという辞書型のプロパティが作られます。このflagsの中のWRITEABLEというプロパティの値を書き換えることで、書き込みの禁止と許可を切り替えます。
import numpy
a.flags['WRITEABLE'] = b
a.flags.writeable = b
変数 |
型 |
内容 |
---|---|---|
a |
ndarray |
書き込み可否を書き換える行列。 |
b |
bool |
Trueの場合は書き込み可。Falseの場合は書き込み不可。 |
NumPy行列の書き込み禁止の実施例
まず、NumPyで行列を作って、flagsがどのように設定されているか表示してみます。
>>> import numpy
>>> a = numpy.array([[1,2,3],[4,5,6],[7,8,9]])
>>> a
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> a.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
>>> a.flags.writeable
True
flagsのWRITEABLEがTrueになってますね。
それでは、3行目の2列目の要素をゼロに書き換えてみます。
>>> a[2,1]
8
>>> a[2,1] = 0
>>> a
array([[1, 2, 3],
[4, 5, 6],
[7, 0, 9]])
はい、書き換えられました。
では、flagsのWRITEABLEをFalseにしてみます。
>>> a.flags['WRITEABLE'] = False
>>> a.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : False
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
>>> a.flags.writeable
False
Falseになりましたね。
では、3行目の2列目の要素を8に戻してみましょう。
>>> a[2,1]
0
>>> a[2,1] = 8
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: assignment destination is read-only
>>> a
array([[1, 2, 3],
[4, 5, 6],
[7, 0, 9]])
エラーになって、行列は書き換えられませんでした。
このように、numpy.ndarrayはWRITEABLEを切り替えることで、書き込み可否の制御ができます。
マニュアル にこのように書いてありますので、書き込み可にできない場合もあります。
WRITEABLE can only be set True if the array owns its own memory or the ultimate owner of the memory exposes a writeable buffer interface or is a string.
公開日
広告
Pythonの数値計算カテゴリの投稿
- NumPyで転置行列を取得する
- NumPyの定数
- Pythonで2つの行列の対応する要素の最大値の行列を作る
- Pythonで2次元メッシュを作る
- Pythonで値が一番大きい要素のインデックスを探す
- Pythonで値が一番小さい要素のインデックスを探す
- Pythonで指定した数値以上の最小の整数を計算する
- Pythonで等間隔の数字の列を作る
- Pythonで等間隔の数字の列を作る(arange編)
- Pythonで行列の次元を調べる
- Pythonで行列の積を計算する
- Pythonで零行列を作る
- PythonのNumPyの行列の書き換えを禁止したり許可したりする
- Pythonの行列のサイズを調べる