Найти местоположение элемента в векторе

Я новичок в 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                      │
└──┴──────────────────────────────────────────┘

Попробуйте онлайн!

Другие вопросы по тегам