APL идиома, чтобы окружить массив нулями - PullRequest
0 голосов
/ 05 июня 2018

Есть ли в APL (Dyalog) простая идиома, чтобы окружить числовой массив нулями?

В настоящее время для числового массива NA ранга 1 или вектора, который я использую

0,⍨0, NA

и для массива ранга 2 я использую

0,[1]⍨0,[1]0,⍨0, NA

Для более высоких рангов я мог бы просто повторить шаблон, но я уверен, что должен быть лучший способ сделать это (и с однимопределение для всех рангов), но я просто не могу придумать тот, который не кажется слишком сложным.

Ответы [ 5 ]

0 голосов
/ 05 июня 2018
0 голосов
/ 05 июня 2018

в ответ на свой ответ;Вы можете уменьшить вместо повторения:

{⊃{0,[⍺]⍵,[⍺]0}/(⍳≢⍴⍵),⊂⍵}

⊂⍵ заключить в массив
(), добавить следующие:
⍴⍵ форма массива
количество элементов этого (т. Е. Ранг массива)
⍳r ɩ указатели ранга
{}/ уменьшаются (вставка между элементами), используяследующая функция:
⍵,[⍺]0 добавить 0s вдоль оси, указанной в левом аргументе
0,[⍺]⍵ добавить 0s вдоль оси, указанной в левом аргументе
раскрыть (поскольку сокращение уменьшает рангот 1 до 0, поэтому он должен заключать результат)

Другими словами, мы добавляем и добавляем 0 по всем осям по очереди.

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

0 голосов
/ 05 июня 2018

Это решение Dyalog APL версии 16.0 (из здесь ) обрабатывает любое количество измерений:

{⍵@(1+⍳⍴⍵)⊢0⍴⍨2+⍴⍵}

массив

@(, размещенный в

1+ один плюс

все индексы

⍴⍵ форма массива

)⊢ в массивесостоящий из

0⍴⍨ ноль, преобразованный в форму

2+ два добавлены к

⍴⍵ форма массива

В другихсловами, мы создаем массив полностью из 0, который в каждом измерении на два элемента больше массива, затем помещаем массив в этот массив (таким образом, заменяя 0 в этих позициях) со смещением в один от краев, то есть вцентр.

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

Альтернативная версия , которая определяет оператор at и поэтому может использоваться до 16.0.

0 голосов
/ 05 июня 2018
{r←≢⍴⍵ ⋄ i←1⌽⍳r ⋄ {0⍪0⍪⍨i⍉⍵}⍣r⊢⍵}

⍴⍵ форма массива
количество элементов этого (т. Е. Ранг массива)
r← сохранить его как r (для r ank)

⍳r ɩ указатели ранга
1⌽ повернуть их на один шаг
i← сохранить в i (для i ndices)

⊢⍵ в массиве
{}⍣r применить следующую функцию r раз (т.е. один раз для измерения):
i⍉⍵переупорядочить оси аргумента в соответствии с i (т.е. поместить следующее измерение впереди)
0⍪⍨ добавить с 0 по первой оси
0⍪ добавить с 0 по первой оси

Другими словами, каждая ось получает свой ход, находясь впереди, где мы добавляем и добавляем 0 с.

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

0 голосов
/ 05 июня 2018

Итак, я обобщил свой метод до рекурсивного dfn, который удовлетворяет моему требованию "работы для произвольного ранга", но я не доволен этим, потому что я все еще думаю, что есть лучший способ сделать это, что я простоотсутствует.Я назвал это ответом, так как он технически отвечает на мой вопрос, но я все еще ищу лучшие решения.

{(⍴⍴⍵){⍺=0:⍵ ⋄ (⍺-1)∇0,[⍺]⍨0,[⍺]⍵}⍵}
...