Как сформировать массив (последовательность), чтобы иметь произвольное количество строк для заданного количества столбцов

Тривиальный пример, показывающий структуру:

{190 10 ⍴⍵}{(⍳⍵)}1900

Это "190" необходимо вычислить как ⍴⍵÷10 или, если есть символ, говорящий "упаковать все элементы в массив р и позволить ему иметь столько строк, сколько необходимо". {(⍳⍵)}1900 - это просто замена произвольного кода, который будет генерировать «поток» чисел, и как только они будут разделены на строки, слева будет больше функций.

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

Было бы полезно, если бы вы указали, какой APL вы используете.

Adám 14.12.2018 12:07

В вашем примере есть ненужные фигурные скобки и круглые скобки: 190 10 ⍴ ⍳1900

Adám 14.12.2018 12:22
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
2
128
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сообщите мне, если какой-либо из следующего кода неясен, и я расскажу, как он работает.

Точное соответствие

Мой репозиторий Расширенный Dyalog APL содержит функция обложки для , который делает именно это, но обобщен на массивы всех рангов. Он позволяет использовать ¯1, чтобы указать, что длина конкретного измерения должна автоматически рассчитываться, чтобы точно соответствовать данным. Код выглядит следующим образом:

⍵⍴⍨(|(×/⍴⍵)÷×/⍺)@(¯1=⊢)⍺, где - вектор формы, а - данные. Попробуй!
(|(×/⍴⍵)÷×/⍺) вычисляет длину длины, помеченной ¯1
. @(¯1=⊢) изменяет этим значением в положениях, указанных маской (¯1=⊢)⍺ (см. поезда)
⍵⍴⍨ преобразует в эту форму (а не в форму )

Если вам просто нужна матрица, следующее будет работать в любом APL, который вы можете использовать:

(((×/⍴⍵)÷⍺),⍺)⍴⍵, где - количество строк, а - данные. Попробуй!

Обивка

Если вы знаете, что хотите дополнить последнюю строку (в отличие от ошибки или пропуска неполной конечной строки), у вас в основном есть три варианта:

  1. Утилизируйте элементы с самого начала данных

  2. Площадка с элементом прототипа

  3. Пэд с настраиваемым элементом заливки

1. Утилизируйте элементы с самого начала данных.

Это просто, потому что делает это по умолчанию, поэтому вам просто нужно округлить () количество строк:

Общее решение Dyalog: ⍵⍴⍨(|(×/⍴⍵)÷×/⍺)@(¯1=⊢)⍺Попробуй!

Матрица только для всех APL: (((×/⍴⍵)÷⍺),⍺)⍴⍵Попробуй!

2. Площадка с элементом прототипа.

Для этого мы берем произведение вычисленного вектора формы и используем его, чтобы «переместить» () элементы из разложенных (,) данных перед тем, как использовать вектор формы для фактического изменения формы:

Общее решение Dyalog: ((⌈|(×/⍴⍵)÷×/⍺)@(¯1=⊢)⍺){⍺⍴(×/⍺)↑,⍵}Попробуй!

Marix только для всех APL: ((⌈(×/⍴⍵)÷⍺),⍺){⍺⍴(×/⍺)↑,⍵}Попробуй!

3. Площадка с настраиваемым элементом заливки.

Мы можем узнать, сколько элементов заливки (я буду использовать ¯3) нам нужно, вычтя количество заданных элементов данных из необходимого числа. Затем мы объединяем (,), что многие элементы заливки с разложенными (,) данными перед изменением формы:

Общее решение Dyalog: ((⌈|(×/⍴⍵)÷×/⍺)@(¯1=⊢)⍺){⍺⍴(,⍵),((×/⍺)-(×/⍴⍵))⍴¯3}Попробуй!

Матрица только для всех APL: ((⌈(×/⍴⍵)÷⍺),⍺){⍺⍴(,⍵),((×/⍺)-(×/⍴⍵))⍴¯3}Попробуй!

Хорошо, вы в основном говорите, что не существует "волшебного" (== без написания колбасы) способа получить это. Я как бы надеялся, что, будучи «языком IBM» APL будет иметь концепцию допустимости значений NULL и толерантности к NULL (null == не знаю, обрабатывать как личность) и что будет «некоторый null», который будет делать то, что вы ¯1 делает - и заполните "нулями", значения по умолчанию ОК лучше (это концепция post SQL, любезно предоставленная C# - потребовалось много времени) :-). На самом деле я думал в терминах «потоковой обработки» - вы вообще не знаете длины, просто они должны быть упакованы в «k-кортежи»

ZXX 16.12.2018 00:07

И так как вы предложили :-) Мне нужно пройти пошаговое руководство для 1-го выражения: что делает (¯1 = ⊢) и где поменять местами «разрезы» справа (я предполагаю, что левый разрез - это ⍵ ▶ ⍴)? Я очень восхищаюсь тем, что делает Dyalog, но их документации так не хватает. Думаю, мне нужен "APL для разработчиков C++, с ярлыками и сопоставлениями терминов для 3" представлений "мира" :-), включая простой и более высокий функционал :-). Проблема с ⍨: не вижу напрямую, где это режет выражение (я полагаю, что нужно было бы записать силу привязки), и нет синтаксиса, чтобы «пометить его» (он может разрезать середину «более функционального» каррирования).

ZXX 16.12.2018 01:03

@ZXX Я добавил краткое объяснение. Это достаточно? Кстати, сила связывания полностью задокументирована. - это просто обычный монадический оператор, такой как ¨.

Adám 17.12.2018 12:33

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