Использование Python / Numpy `as_strided` для эффективного создания перекрывающихся патчей из непересекающихся последовательностей - PullRequest
0 голосов
/ 21 октября 2018

У меня есть 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]])
>>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...