Я хотел бы создать ссылку только для чтения на массив NumPy. Это правильный способ сделать b
доступной только для чтения ссылкой на a
(a
- это любой массив NumPy)?
def get_readonly_view(a):
b = a.view()
b.flags.writeable = False
return b
В частности, я хотел бы убедиться, что вышеприведенное делает не копировать содержимое a
? (Я пытался проверить это с помощью np.shares_memory
, и он возвращает True
. Но я не уверен, является ли это правильным тестом.)
Кроме того, мне интересно, реализован ли get_readonly_view
в * 1029? *?
Обновление. Было предложено превратить массив в свойство класса, чтобы сделать его доступным только для чтения. Я думаю, что это не работает:
import numpy as np
class Foo:
def __init__(self):
self._a = np.arange(15).reshape((3, 5))
@property
def a(self):
return self._a
def bar(self):
print(self._a)
Но клиент может изменить содержимое _a
:
>> baz = Foo()
>> baz.bar()
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
>> baz.a[1, 2] = 10
>> baz.bar()
[[ 0 1 2 3 4]
[ 5 6 10 8 9]
[10 11 12 13 14]]
, в то время как я хотел бы baz.a[1, 2] = 10
, чтобы вызвать исключение.