PythonのNumPyの行列の書き換えを禁止したり許可したりする

Pythonで使うNumPyのndarrayは、オブジェクトのプロパティを設定することで、書き換えを許可したり禁止したりできます。

目次

  1. numpy.ndarray.flagsプロパティとは
  2. NumPy行列の書き込み禁止の実施例

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の数値計算カテゴリの投稿