Использовать # (Копировать) как выделение или фильтр на 2-м массиве - PullRequest
0 голосов
/ 22 декабря 2018

J-примитив Копия (#) может использоваться в качестве функции фильтра, например

k =: i.8
(k>3) # k
4 5 6 7

По сути,

0 0 0 0 1 1 1 1 # i.8

Вопрос в том, является ли правая часть # массивом 2-го или более высокого ранга, как сделать выбор, используя #, если это возможно.Например:

k =: 2 4 $ i.8

(k > 3) # k

Я получил length error

Как правильно сделать такой выбор?

1 Ответ

0 голосов
/ 23 декабря 2018

Вы можете использовать соответствующий ранг глагола, чтобы получить что-то вроде 2d-выбора:

(2 | k) #"1 1 k
1 3
5 7

, но запрошенные оси должны быть заполнены 0 s (или !.), чтобы сохранитьправильная форма:

(k > 3) #("1 1) k
0 0 0 0
4 5 6 7

(k > 2) #("1 1) k
3 0 0 0
4 5 6 7

Вы должны лучше определить select для измерений> 1, потому что теперь у вас есть структура.Как вы отбрасываете ценности?Вы держите пустые "клетки"?Вы заменяете на 0 s?Важна ли структура для результата?

Если, например, вам нужны только "значения где", то просто ravel , массив:

(,k > 2) # ,k
3 4 5 6 7

Если вам нужно "заменитьгде ", то вы можете использовать поправку }:

u =: 5 :'I. , 5 >  y'     NB. indices where 5 > y
0 u } k
0 0 0 0
0 5 6 7

z =: 3 2 4 $ i.25
u =: 4 :'I. , (5 > y) +. (0 = 3|y)'     NB. indices where 5>y or 3 divides y
_999 u } z
_999 _999 _999 _999
_999    5 _999    7

  8 _999   10   11
_999   13   14 _999

 16   17 _999   19
 20 _999   22   23
...