Каждое предыдущее наречие в J - PullRequest
2 голосов
/ 11 февраля 2020

В Q / kdb вы можете легко изменить глагол с помощью ':, который представляет каждый предшествующий. Он будет применять глагол к элементу и его предыдущему соседу. Например,

=': проверяет, равны ли пары значений. В J вы можете легко сбросить /\, но это кумулятивно, есть ли парная версия этого?

1 Ответ

4 голосов
/ 12 февраля 2020

\ имеет диади c валентность для выбора списков определенной длины, с различным поведением в зависимости от положительной и отрицательной длин:

   2]\i.4
0 1
1 2
2 3
   3]\i.4
0 1 2
1 2 3
   _2]\i.4
0 1
2 3
   _3]\i.4
0 1 2
3 0 0

То есть для сравнения пар :

   n=:1 2 2 2 3 3 1
   2]\n
1 2
2 2
2 2
2 3
3 3
3 1
   =/"(1) 2]\n
0 1 1 0 1 0
   _2]\n
1 2
2 2
3 3
1 0
   =/"(1) _2]\n
0 1 1 0

Заботясь о последней паре, вы также можете повернуть список:

   n ,: n
1 2 2 2 3 3 1
1 2 2 2 3 3 1
   (] ,: 1&|.) n
1 2 2 2 3 3 1
2 2 2 3 3 1 1
   =/(] ,: 1&|.) n
0 1 1 0 1 0 1

Если вы хотите получить каждый элемент с предыдущий сосед:

   2|.\1 2 3 4
2 1
3 2
4 3

Существует также использование 'subarrays' cut:

   2 <;.3 n
┌───┬───┬───┬───┬───┬───┬─┐
│1 2│2 2│2 2│2 3│3 3│3 1│1│
└───┴───┴───┴───┴───┴───┴─┘
   2 <;._3 n
┌───┬───┬───┬───┬───┬───┐
│1 2│2 2│2 2│2 3│3 3│3 1│
└───┴───┴───┴───┴───┴───┘
   2 =/;._3 n
0 1 1 0 1 0
...