Используйте ⎕DR
(Data RR_1_RПредставительство), чтобы проверить тип вещей. Для char-vec это 82 (в 32-битном интерпретаторе) или 80 (64-битный), а поскольку 64-битная платформа поддерживает юникод, это также может быть 160 или 320. Вложенный вектор - 326.
NB:, вы также можете использовать ⎕DR¨
, чтобы выяснить, какой элемент не соответствует вашим ожиданиям ...
Вполне может быть, что один из элементов вашего вектора сам является вектором (длины 1). Используйте ⍴¨
, чтобы получить некоторое представление об этом ...
Я пробовал {⍬ ≡ ⍴⍵}¨ v
, но он оценивает вектор, в котором все элементы равны 1. Если я не ошибаюсь, это означает, что ни один элемент не является вектором.
Откуда взялся этот вектор? Если он был создан fn, может быть полезно увидеть код ..
Извините, с первого раза я не заметил обидного элемента. Выражение ({82 ≠ ⎕DR ⍵}¨ v) / ⍳⍴v
дало мне позицию (282), которая содержит одноэлементный вектор с целым нулем.
Хорошо, спасибо, что нашли это! Я был очень сбит с толку, когда вы сказали, что это все скаляры ;-)
Поправка: (({82 ≠ ⎕DR ⍵}¨ v) / ⍳⍴v) ⊃ v
равен нулю.
Кстати, если вы используете V17, вы можете использовать ⍸bool
вместо bool/⍳⍴bool
;-)
@MBaas И вы тоже можете, если вы используете версию 16.0.
Выражение * ⊃0⍴⊂A
дает вам тип A
. Тип массива - это, проще говоря, копия массива, но все содержимое рекурсивно заменяется нулями для чисел и пробелами для символов. Это означает, что вы можете сравнить тип с 0
, чтобы найти числа.
Возьмем, к примеру, следующий вектор с несколько обманчивой формой отображения по умолчанию: Try it!
⊢v←'abc',1 2,'de 3 4',5
abc 1 2 de 3 4 5
Форма отображения в рамке не сообщает вам тип каждого элемента простого вектора; это только указывает на то, что массив имеет смешанный тип с +
в нижнем левом углу: Try it!
]display v
┌→───────────────┐
│abc 1 2 de 3 4 5│
└+───────────────┘
Теперь находим тип: Try it!
⊢t←⊃0⍴⊂v
0 0 0
Мы можем сложить его поверх исходного вектора, чтобы указать на числа: Try it!
↑t v
0 0 0
abc 1 2 de 3 4 5
Или мы можем сравнить его с нулем, чтобы получить маску для чисел: Try it!
⊢m←0=t
0 0 0 1 1 0 0 0 0 0 0 1
Наконец, мы можем получить индексы, где ** есть числа: Try it!
⍸m
4 5 12
* If you are using ⎕ML←0
, then ⊃0⍴⊂
can be written as the single primitive function ∊
** If you are using version 15.0 or earlier you will have to write {(,⍵)/,⍳⍴⍵}
instead of ⍸
Я на APL2. Наивно я бы пошел за
X≡¨⍕¨X
Числовые значения получают 1, а символьные значения - 0.
Это помогло, спасибо! Как ни странно, для рассматриваемого вектора v ⎕DR¨ v возвращает вектор, в котором все элементы равны 82, несмотря на то, что v является смешанным вектором, а не вектором символов.