#python #arrays #numpy
#python #массивы #numpy
Вопрос:
У меня есть массив a
и, возможно, его представление v
. Какой самый быстрый (и, возможно, самый простой) способ проверить, v
действительно ли это представление a
, а не копия?
Я вижу, что есть np.shares_memory, но в этом документе сказано, что функция иногда может быть экспоненциально медленной.
Я предполагаю, что представления являются легковесными ссылками на исходный массив, а запись в представления всегда изменяет исходный массив (кстати, это правильное предположение?).
Например v = a[1:5]
, это представление, но v = a[[1,3,6]]
это не так.
Если v
это представление, то выполнение v[...] = [1,2,3]
всегда должно также изменять исходный массив, если это не представление, то выполнение этой операции изменяет только копию a
.
Поэтому я хочу быть уверен, assert
что каким-то образом это действие v[...] = [1,2,3]
также изменит исходный массив, т. Е. Я хочу утверждать, что v
это представление a
.
Комментарии:
1. Является ли это экспоненциально медленным для вашего варианта использования? Вы профилировали его?
2. @Divakar Нет, у меня простой случай. Я просто изучаю правильный путь. Если это канонический способ проверки представления, я буду использовать его, даже если он медленный. Но, поскольку я все еще учусь, я хотел один раз запомнить правильный способ сделать это и всегда использовать его позже. Или, по крайней мере, услышать, какие есть разные способы сделать это.
3. @Divakar Также я подумал, что представление всегда хранится внутри как исходный (тот же) указатель плюс, возможно, смещение плюс срез плюс форма. Так что это можно просто проверить, сравнив, что указатель одинаковый. Но, вероятно, это не так.
4. Я смотрю на arr.__array_interface__
. If the
data`число перекрывается, я думаю, это представление. Но я не пытался проверить это в коде.5. @hpaulj Следующее применение этой проверки — если какая-то функция
f(a)
вернула представлениеa
, и я изменил некоторые элементы этого представления, как я могу быть уверен (assert
), что в оригиналеa
также были эти изменения (я не знаю точных позиций в исходном массиве, поэтому я не могу сравнить, изменились ли эти элементы).