Разделение вектора символов на сегменты

У меня есть следующий вектор Vec: ACGTTGCA и я хотел бы разделить его на вложенный вектор, в котором на i-й позиции будет подотрезок Vec длины 4, начиная с i-й позиции Vec.

Например, Vec[(⍳¯3+⍴Vec)∘.+¯1+⍳4] возвращает:

ACGT
CGTT
GTTG
TTGC
TGCA

Но проблема с приведенным выше выводом заключается в том, что это символьная матрица, тогда как я хотел бы получить следующий вывод:

┌──────────────────────────┐
│┌────┬────┬────┬────┬────┐│
││ACGT│CGTT│GTTG│TTGC│TGCA││
│└────┴────┴────┴────┴────┘│
└──────────────────────────┘

Для следующей строки: vec←'Hy, only testing segmenting vec into pieces of 4' правильным результатом того, что я ищу, будет:

┌→────────────────────────────────────────┐
│ ┌→───┐ ┌→───┐ ┌→───┐ ┌→───┐             │
│ │Hy, │ │y, o│ │, on│ │ onl│ (and so on) │
│ └────┘ └────┘ └────┘ └────┘             │
└∊────────────────────────────────────────┘

Кроме того, есть ли способ преобразовать такой вектор в один вектор, в котором последующие строки будут содержать 4 символа?

Пример: для вектора символов foobartesting результатом будет:

foob
ooba
obar
bart
arte
rtes
test
esti
stin
ting

person syntagma    schedule 22.07.2014    source источник


Ответы (3)


Это проверено в GNU APL, но я не думаю, что в Dyalog должно быть по-другому. Мое решение так же просто, как это:

      4 ,/ 'foobartesting'
 foob ooba obar bart arte rtes test esti stin ting
person Elias Mårtenson    schedule 28.07.2014
comment
Спасибо, я знал, что должно быть более простое (и быстрое) решение. - person syntagma; 28.07.2014
comment
Кстати, есть ли способ сделать то же самое, то есть создать один вектор, который выглядит так: foob\nooba\nobar\n(...)\nting (отредактировал мой вопрос, чтобы показать, о чем я прошу)? - person syntagma; 28.07.2014
comment
Просто используйте монадический ⊃. Это возьмет список массивов и создаст из него двумерный массив. То есть, простое выполнение ⊃ 4 ,/ 'foobartesting' должно сделать это. Я не знаю, должен ли я обновить ответ, чтобы покрыть это? - person Elias Mårtenson; 29.07.2014
comment
Было бы здорово, если бы вы обновили свой ответ, потому что я не могу заставить его работать. - person syntagma; 29.07.2014
comment
Я помню, как видел, как Дялог перепутал символы ⊃ и ↑ (или что-то в этом роде). На это также повлияла настройка ⎕ML. Я не пользуюсь Dyalog, поэтому проверить себя не могу, но попробуйте заменить ⊃ на ↑ или ↓. - person Elias Mårtenson; 29.07.2014
comment
Отлично, работает с ↑, то есть: ↑4 ,/ 'foobartesting'. Спасибо еще раз. - person syntagma; 29.07.2014

Чтобы вернуться к вашему первоначальному вопросу: вам нужно всего лишь добавить начальный «разделитель» (↓), чтобы превратить результат вашей матрицы в вектор векторов, которые вы (искали). Обратите внимание, что, хотя оно может быть не таким элегантным, «классическое» решение, основанное на создании матрицы индексов, может быть намного более эффективным, потому что это конкретное оконное сокращение не входит в список случаев, оптимизируемых большинством интерпретаторов APL.

В Dyalog APL v14.0/64, работающем на Intel Core i5 с частотой 1,60 ГГц:

x ← 'foobartesting'

(4 ,/ x) выполняется примерно за 9,3 микросекунды

(↓4 {⍵[(0,⍳-⍺-⍴⍵)∘.+⍳⍺]} x) составляет около 2,3

По мере увеличения длины вектора увеличивается разрыв в эффективности; к тому времени, когда вы достигнете длины аргумента 10 000, оконное сокращение будет почти в 10 раз медленнее (7 против 0,7 миллисекунды).

В Dyalog APL эффективность «классического» подхода повышается за счет наличия 1-байтовых и 2-байтовых целочисленных типов; ваш пробег может отличаться, если вы используете другие интерпретаторы APL.

person Morten Kromberg    schedule 16.08.2014

Я не уверен, что правильно понял ваше описание. Но я понял, что у вас есть вектор:

vec←'Hy, only testing segmenting vec into pieces of 4'

О, кроме того, нам нужно назначить уровень миграции для этого упражнения ;-)

⎕ml←3

Измененный ответ после понимания вопроса ;-):

      display 4{⍺↑¨(0,⍳(⍴⍵)-⍺)↓¨⊂⍵}'ACGTTGCA'
┌→───────────────────────────────────┐
│ ┌→───┐ ┌→───┐ ┌→───┐ ┌→───┐ ┌→───┐ │
│ │ACGT│ │CGTT│ │GTTG│ │TTGC│ │TGCA│ │
│ └────┘ └────┘ └────┘ └────┘ └────┘ │
└∊───────────────────────────────────┘
person MBaas    schedule 22.07.2014
comment
Спасибо, но это не совсем то, что я ищу. Я обновил свой вопрос, чтобы показать, как я хочу обработать ваш пример. - person syntagma; 22.07.2014
comment
Хорошо, спасибо за дополнительную информацию - я обновил свой ответ :) - person MBaas; 22.07.2014