2015-04-02 5 views
3

В Python 3.x я работаю с большими массивами numpy. Я хотел бы иметь подтверждение (без фактического выполнения какого-либо эксперимента), что методы, которые я написал, либо работают с копией массива OR, либо работают с прямой ссылкой на массив.Как проверить, выполняется ли копирование на Python?

Я хотел бы также подтвердить, что массив, о котором идет речь, был изменен или не был изменен.

В C++, если бы я хотел убедиться, что объект не был изменен, я мог бы передать его как const ... в Python, я, похоже, не имел таких заверений и должен быть очень осторожным.

Итак, чтобы подвести итог: мне нужно выяснить, была ли копия получена или не была создана из массива numpy. Мне нужен способ определить, был ли изменен массив (или любой объект). Я предпочел бы быстрый, автоматический способ, а не эксперимент.

+2

Оба [(наивным использование) '.base'] (http://stackoverflow.com/questions/11286864/is-there-a-way-to-check-if-numpy-arrays-share -the-same-data # comment14852955_11286976) и ['.flags ['OWNDATA']'] (http://stackoverflow.com/q/28886731/190597) могут привести к ложным выводам. [Согласно разработчику NumPy Роберту Керну] (http://stackoverflow.com/a/10752605/190597), лучшее, что у нас есть на данный момент: 'np.may_share_memory'. – unutbu

ответ

8

Вы можете использовать np.ndarray.flags:

>>> a = np.arange(5) 
>>> a.flags 
    C_CONTIGUOUS : True 
    F_CONTIGUOUS : True 
    OWNDATA : True 
    WRITEABLE : True 
    ALIGNED : True 
    UPDATEIFCOPY : False 

Например, вы можете установить массив не будет записываемый, используя np.setflags; В этом случае попытка изменить массив не получится:

>>> a.setflags(write=False) # sets the WRITEABLE flag to False 
>>> a[2] = 10    # the modification will fail 
ValueError: assignment destination is read-only 

Другим полезным флагом является OWNDATA, который, например, может указывать, что массив на самом деле вид на другой массив, так что не владеет его данные:

>>> a = np.arange(5) 
>>> b = a[::2] 
>>> a.flags['OWNDATA'] 
True 
>>> b.flags['OWNDATA'] 
False 
+1

Я не знал, что это возможно. Это действительно полезно. – TheBlackCat

+0

@ behzad.nouri Это здорово, спасибо, большое вам спасибо! Интересно, типа массива Python, например? список и т. д. имеют такие функции? Это тоже было бы очень полезно. –

Смежные вопросы