Выражение * ⊃0⍴⊂A
дает вам тип A
. Тип массива, проще говоря, копия массива, но все содержимое рекурсивно заменяется нулями для чисел и пробелами для символов. Это означает, что вы можете сравнить тип с 0
, чтобы найти числа.
Возьмем, к примеру, следующий вектор с несколько обманчивой формой отображения по умолчанию: Попробуйте!
⊢v←'abc',1 2,'de 3 4',5
abc 1 2 de 3 4 5
Форма в штучной упаковке не показывает тип каждого элемента простого вектора; это только означает, что массив имеет смешанный тип с +
в нижнем левом углу: Попробуйте!
]display v
┌→───────────────┐
│abc 1 2 de 3 4 5│
└+───────────────┘
Теперь мы находим тип: Попробуйте!
⊢t←⊃0⍴⊂v
0 0 0
Мы можем сложить его поверх исходного вектора, указав на числа: Попробуйте!
↑t v
0 0 0
abc 1 2 de 3 4 5
Или мы можем сравнить его с нулем, чтобы получить маску для чисел: Попробуйте!
⊢m←0=t
0 0 0 1 1 0 0 0 0 0 0 1
Наконец, мы можем получить индексы, где ** есть цифры: Попробуйте!
⍸m
4 5 12
* Если вы используете ⎕ML←0
, тогда ⊃0⍴⊂
можно записать как одну примитивную функцию ∊
** Если вы используете версию 15.0 или более раннюю, вам придется написать {(,⍵)/,⍳⍴⍵}
вместо ⍸