Подтвердить что ты не робот

Numpy: Надежный (неконсервативный) индикатор, если отображается массив numpy

Ищете способ надежно идентифицировать, является ли объект numpy представлением.

Связанные вопросы возникли много раз (here, здесь, здесь), и люди предложили некоторые решения, но все, похоже, имеют проблемы:

  • Тест, используемый в pandas, теперь должен вызвать что-то, если my_array.base is not None. Кажется, что это всегда ловить взгляды, но также предлагает множество ложных срабатываний (ситуации, когда он сообщает что-то, является видом, даже если это не так).
  • numpy.may_share_memory() будет проверять наличие двух конкретных массивов, но не будет отвечать в общем случае
    • (@RobertKurn говорит, что лучший инструмент с 2012 года - любые изменения?)
  • flags['OWNDATA']) сообщил (третий комментарий первого ответа) в некоторых случаях потерпеть неудачу.

(Причина моего интереса заключается в том, что я работаю над реализацией copy-on-write для pandas, а консервативный индикатор приводит к избыточному копированию.)

4b9b3361

Ответ 1

В зависимости от ваших обычаев flags['OWNDATA'] выполнит эту работу. На самом деле, нет никакой проблемы с вашей ссылкой. В некоторых случаях это не срабатывает. Он всегда будет делать то, что должен делать.

Согласно http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.require.html: флаг "обеспечивает массив, который владеет своими собственными данными".

В вашем "контрпример" они используют код:

print (b.flags['OWNDATA'])  #False -- apparently this is a view
e = np.ravel(b[:, 2])
print (e.flags['OWNDATA'])  #True -- Apparently this is a new numpy object.

Но во втором случае это нормальное поведение True.

Он исходит из определения ravel (из http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.ravel.html).

Возвращает непрерывный сплющенный массив. Возвращается 1-D массив, содержащий элементы ввода. Копия делается только при необходимости.

Здесь требуется копия, поэтому сделана копия. Таким образом, переменная e действительно владеет собственными данными. Это не "вид b", "ссылка на b", "псевдоним на часть b". Это настоящий новый массив, содержащий копию некоторых элементов b.

Итак, Я думаю, что это невозможно без отслеживания всего источника данных для обнаружения такого поведения. Я считаю, что вы должны создать свою программу с этим флагом.