Найти местоположение элемента в векторе
Я новичок в APL, и я хотел бы найти положение элемента (ов) в векторе. Например, если я создаю вектор из 50 случайных чисел:
lst ← 50 ? 100
Как я могу найти позиции 91, предполагая, что это происходит 3 раза в векторе?
Благодарю.
4 ответа
С Dyalog 16.0 вы можете использовать новую монадическую функцию ⍸
"Куда".
⍸lst=91
lst=91
дает вектор 0 и 1. применение ⍸
на это дает расположение всех 1. Это также работает, если lst
это матрица
Я не эксперт, но простой способ состоит в том, чтобы просто выбрать элементы из ⍳ 100
где соответствующий элемент в lst
является 91
(lst=91)/⍳100
Благодаря ngn, Cows_quack и Проби. Я должен был прочитать Mastering Dyalog APL более внимательно, поскольку это также упоминается на стр. 126. Итак, собрав все ответы вместе:
⍝ Generate a list of 100 non-unique random numbers
lst ← ?100⍴100
⍝ How many times does 1, for example, appear in the vector Using the compress function?
+/ (lst = 1) ⍝ Appears twice
2
⍝ Find the locations of 1 in the vector
(lst = 1) / ⍳ ⍴ lst
2 37 ⍝ Positions 2 and 37
Таким образом, чтобы сломать решение; (i) (lst = 1) генерирует логический вектор, где true встречается, когда существует значение int 1; (ii) сжатие вектора lst булевым вектором создает новый вектор с позициями 'true' в lst.
Поправьте меня, если мое описание выключено?
УПРОЩЕНИЕ:
Использование функции "Где" делает ее более читаемой (хотя предыдущий метод показывает, как для ее решения используется мышление APL для программирования массивов):
⍸lst=1
2 37 ⍝ Positions 2 and 37
Спасибо за ваше время на это!
С уважением
Хотя на ваш вопрос уже получен исчерпывающий ответ, вас может заинтересовать оператор Key, ⌸
, Когда его производная функция применяется монадически, она берет один операнд и применяет его один раз для каждого элемента в аргументе. Функция вызывается с уникальным элементом в качестве левого аргумента и списком его индексов в качестве правого аргумента:
lst ← ?100⍴10
{⍺ ⍵}⌸lst
┌──┬──────────────────────────────────────────┐
│3 │1 3 9 28 37 38 55 70 88 │
├──┼──────────────────────────────────────────┤
│10│2 6 13 17 30 59 64 66 71 82 83 96 │
├──┼──────────────────────────────────────────┤
│7 │4 5 12 15 20 52 54 68 74 85 89 91 92 │
├──┼──────────────────────────────────────────┤
│9 │7 11 24 47 53 58 69 86 90 │
├──┼──────────────────────────────────────────┤
│8 │8 14 16 21 43 51 63 67 73 80 │
├──┼──────────────────────────────────────────┤
│2 │10 18 26 27 34 36 48 78 79 87 │
├──┼──────────────────────────────────────────┤
│1 │19 25 31 32 33 42 57 65 75 84 97 98 99 100│
├──┼──────────────────────────────────────────┤
│6 │22 23 45 46 50 60 76 94 │
├──┼──────────────────────────────────────────┤
│5 │29 49 56 61 72 77 93 95 │
├──┼──────────────────────────────────────────┤
│4 │35 39 40 41 44 62 81 │
└──┴──────────────────────────────────────────┘