У меня есть 2-d
массив пустышек формы NxM
, который представляет M
смежных образцов из N
различных последовательностей.Мне нужно представить патчи L
образцов (L << M
), охватывающих весь набор данных, в виде массива 2-d
.Слишком много данных, чтобы создать новый набор данных путем простого копирования всех исправлений.
Если бы была одна последовательность, было бы очень просто сгенерировать перекрывающиеся исправления без копирования каких-либо данных с использованием as_strided
trick:
patches = np.lib.stride_tricks.as_strided(data, shape(N*M-L+1,L), strides=(8,8))
Проблема с этим подходом для моих данных заключается в том, что он генерирует патчи, которые перекрывают отдельные последовательности.
Я также могу увидеть, как генерировать трехмерный массив формыN,M-L+1,L
с использованием чего-то вроде:
patches = np.lib.stride_ticks.as_strided(data, shape(N,M-L+1,L), strides=(8*M,8,8))
Это дает правильные исправления, но я не уверен, как свернуть первые два измерения в одно.
Очевидно, что есть несколько ответов SOдо as_strided
, но я не смог найти ни одного, который отвечал бы этим конкретным требованиям.
Любые идеи приветствуются.
Редактировать : следует короткий пример
Вот пример использования as_strided
для создания массива 3-d
, который почти выполняет задачу:
>>> a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
>>> a
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
>>> b = np.lib.stride_tricks.as_strided(a, shape=(3, 3, 2), strides=(32,8,8))
>>> b
array([[[ 1, 2],
[ 2, 3],
[ 3, 4]],
[[ 5, 6],
[ 6, 7],
[ 7, 8]],
[[ 9, 10],
[10, 11],
[11, 12]]])
>>>
Проблема с попыткой сгладить этот массив 3-d
в2-d
, как подсказывает @Divakar, заключается в том, что изменение формы дает правильные данные, но делает это путем создания копии, которая создает неуправляемый объем данных для актуальной проблемы:
>>> c = b.reshape(-1,b.shape[-1])
>>> c
array([[ 1, 2],
[ 2, 3],
[ 3, 4],
[ 5, 6],
[ 6, 7],
[ 7, 8],
[ 9, 10],
[10, 11],
[11, 12]])
>>> b[0][0][0] = 9999
>>> c
array([[ 1, 2],
[ 2, 3],
[ 3, 4],
[ 5, 6],
[ 6, 7],
[ 7, 8],
[ 9, 10],
[10, 11],
[11, 12]])
>>>