Введение

Библиотека для программирования массивами на Perl. Perl Data Language (сокращенно PDL) — это набор бесплатных расширений для языка программирования Perl, обеспечивающих возможности программирования массивами. PDL расширяет встроенные в Perl структуры данных, добавляя поддержку больших многомерных массивов, и предоставляет функциональность для манипулирования этими массивами как векторными объектами. Также он включает инструменты для обработки изображений, машинного обучения, компьютерного моделирования физических систем, а также для графического представления данных и построения графиков. Простые операции автоматически векторизуются для применения ко всем элементам массивов, и поддерживаются операции с многомерными данными (например, умножение матриц).

Языковой дизайн

PDL — это векторизованный язык программирования для работы с массивами: синтаксис выражений является вариацией стандартной математической векторной нотации, что позволяет пользователю комбинировать и выполнять операции над большими массивами с помощью простых выражений. В этом отношении PDL продолжает традиции языка программирования APL и сопоставим с коммерческими языками, такими как MATLAB и Interactive Data Language, а также с бесплатными языками, такими как NumPy и Octave. В отличие от MATLAB и IDL, PDL обеспечивает большую гибкость в индексации и векторизации: например, если подпрограмма обычно работает с двумерным матричным массивом, передача ей трехмерного куба данных, как правило, приводит к выполнению той же операции над каждым двумерным слоем куба. PDL заимствует у Perl как минимум три основных типа программной структуры: императивное, функциональное и конвейерное программирование, которые могут быть объединены. Подпрограммы могут загружаться либо с помощью встроенного механизма автоматической загрузки, либо через стандартный механизм модулей Perl.

Графика

В соответствии с истоками Perl как языка склейки, PDL использует различные модули для поддержки графики и построения графиков. NetPBM обеспечивает ввод и вывод файлов изображений (хотя формат FITS поддерживается изначально). Для 2D-графики и визуализации данных поддерживаются модули Gnuplot, PLplot, PGPLOT и Prima, а для 3D-построения графиков и рендеринга – Gnuplot и OpenGL.

В/В

PDL предоставляет средства для чтения и записи множества открытых форматов данных, включая JPEG, PNG, GIF, PPM, MPEG, FITS, NetCDF, GRIB, необработанные двоичные файлы и текстовые таблицы с разделителями. Программисты PDL могут использовать библиотеки ввода-вывода CPAN Perl для чтения и записи данных в сотнях стандартных и специализированных форматов файлов.

Машинное обучение

PDL может использоваться для машинного обучения. Он включает модули для выполнения классической k-средних кластеризации, а также общих и обобщенных методов линейного моделирования, таких как ANOVA, линейная регрессия, PCA и логистическая регрессия. Примеры использования PDL для задач регрессионного моделирования включают оценку связи между уровнем образования и происхождением родителей, сравнение профилей взаимодействия РНК с белками, требующих регрессионной нормализации, и анализ спектров галактик.

Реализация

Основная часть PDL написана на C. Большая часть функциональности реализована на PP – специфическом метаязыке PDL, который выполняет векторизацию простых фрагментов кода на C и обеспечивает взаимодействие с Perl посредством компилятора XS. Некоторые модули написаны на Fortran с использованием C/PP-интерфейса. Многие поставляемые функции написаны непосредственно на PDL. PP доступен пользователям для написания расширений PDL на языке C. Также существует модуль Inline (Inline::Pdlpp), позволяющий вставлять определения функций PP непосредственно в скрипт Perl; соответствующий код компилируется на низком уровне и предоставляется в виде подпрограммы Perl. API PDL использует базовую объектно-ориентированную функциональность Perl 5: PDL определяет новый тип скалярного объекта Perl (называемый "PDL" или "ndarray"), который ведет себя как скаляр Perl, но содержит типизированный массив числовых или символьных значений. Все стандартные операторы Perl перегружены для прозрачного использования с объектами PDL, и объекты PDL могут смешиваться и взаимодействовать с обычными скалярами Perl. Основные модули предоставляют несколько сотен объектных методов для работы с PDL.