Ответ 1
Нет, предупреждение для as_strided
- это две проблемы, которые не связаны с размером данных и больше результата при записи в результирующее представление.
- Во-первых, нет защиты, чтобы гарантировать, что
view = as_strided(a . . . )
указывает только на память вa
. Вот почему перед тем, как позвонитьas_strided
, сделано так много преднамеренной подготовки. Если ваш алгоритм выключен, вы можете легко указатьview
в памяти, которая не находится вa
, и которая действительно может быть адресована мусору, другим переменным или вашей операционной системе. Если вы затем напишете на это представление, ваши данные могут быть потеряны, неуместны, повреждены., или сбой вашего компьютера.
Для вашего конкретного примера, насколько безопасно это зависит от того, какие данные вы используете. Вы установили strides
с помощью a.strides
, чтобы он был динамическим. Вы можете assert
, чтобы dtype
of a
не был чем-то странным, как object
.
Если вы уверены, что у вас всегда будет 2-d a
, который больше, чем window
, вы, вероятно, будете в порядке с вашим алгоритмом, но вы также можете assert
, чтобы убедиться. Если нет, вы можете убедиться, что вывод as_strided
работает для массивов n-d a
. Например:
shape = a.shape[0] - window + 1, window, a.shape[-1]
Вероятно,
shape = (a.shape[0] - window + 1, window) + a.shape[1:]
чтобы принять вход n-d. Вероятно, это никогда не будет проблемой для ссылки на плохую память, но текущий shape
будет ссылаться на неверные данные в a
, если у вас больше измерений.
- Во-вторых, представление создало несколько ссылок на одни и те же блоки данных. Если вы затем выполните параллельную запись в это представление (через
view = foo
илиbar( . . ., out = view)
), результаты могут быть непредсказуемыми и, вероятно, не то, что вы ожидаете.
Тем не менее, если вы боитесь проблем и не нуждаетесь в записи в представлении as_strided
(так как вы не используете большинство приложений свертки, где это обычно используется), вы всегда можете установить его как writable = False
, что предотвратит обе проблемы, даже если ваши strides
и/или shape
неверны.
EDIT: Как указано в @hpaulj, в дополнение к этим двум проблемам, если вы что-то делаете с view
, который создает копию (например, .flatten()
или причудливую индексацию большого фрагмента из этого), это может вызвать MemoryError
.