PDL (Perl Data Language) を使ってみたので、その時のメモをここに残します。
PDL とは
PDL (Perl Data Language) は、Perl で NumPy のような高速な数値演算・ベクトル処理を可能にする拡張ライブラリです。
Perl の標準的なスカラー・配列・ハッシュでは、数値計算や大規模データの処理は遅くなります。
PDL は、C言語レベルの数値配列(ndarray的なもの)を扱えるようにし、ベクトル化された高速計算を提供します。
特徴
| 機能 | 説明 |
| 多次元配列 | NumPyの`ndarray`のように、2次元・3次元以上のデータを扱える |
| ベクトル演算 | ループを使わずに配列演算を実行可能(Cレベルで高速) |
| 線形代数・統計 | 行列計算、固有値、相関、フーリエ変換などの関数が豊富 |
| 可視化 | `PDL::Graphics::Gnuplot` や `PDL::Graphics::Prima` でプロット可能 |
| CやFortranとの連携 | 高速化のためにC拡張を簡単に組み込める |
| 拡張パッケージが豊富 | 画像処理、天文学、物理など科学用途の拡張がある |
インストール方法
CPAN からインストールできます。
cpan install PDL or cpanm PDL
サンプルスクリプト
- PDL配列(piddles)の作成
- 基本的な算術演算
- 統計関数(平均、合計、最小値、最大値)
- 行列演算
- 乱数生成
- 配列スライシング
- 数学関数(sin, cos等)
- 範囲とシーケンスの生成
#!/usr/bin/env perl use strict; use warnings; use PDL; use PDL::NiceSlice; use PDL::Constants qw(PI); print "=== PDL (Perl Data Language) Sample Script ===\n\n"; # 1. Creating PDL arrays (piddles) print "1. Creating PDL arrays (piddles)\n"; my $x = pdl [1, 2, 3, 4, 5]; print "Vector x: $x\n"; my $matrix = pdl [[1, 2, 3], [4, 5, 6], [7, 8, 9]]; print "Matrix:\n$matrix\n"; # 2. Basic arithmetic operations print "\n2. Basic arithmetic operations\n"; my $y = pdl [2, 4, 6, 8, 10]; print "y: $y\n"; print "x + y: ", $x + $y, "\n"; print "x * y: ", $x * $y, "\n"; print "x ** 2: ", $x ** 2, "\n"; # 3. Statistical functions print "\n3. Statistical functions\n"; my $data = pdl [1.2, 3.4, 5.6, 7.8, 9.0, 2.3, 4.5]; print "Data: $data\n"; print "Mean: ", $data->avg(), "\n"; print "Sum: ", $data->sum(), "\n"; print "Min: ", $data->min(), "\n"; print "Max: ", $data->max(), "\n"; # 4. Matrix operations print "\n4. Matrix operations\n"; my $a = pdl [[1, 2], [3, 4]]; my $b = pdl [[5, 6], [7, 8]]; print "Matrix A:\n$a\n"; print "Matrix B:\n$b\n"; print "A x B (matrix multiplication):\n", $a x $b, "\n"; # 5. Random number generation print "\n5. Random number generation\n"; my $random = random(5); print "Random vector (5 elements): $random\n"; # 6. Array slicing print "\n6. Array slicing\n"; my $number_sequence = sequence(10); # Creates [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] print "Full array: $number_sequence\n"; print "First 5 elements: ", $number_sequence(0:4), "\n"; print "Last 3 elements: ", $number_sequence(-3:-1), "\n"; # 7. Mathematical functions print "\n7. Mathematical functions\n"; my $angles = pdl [0, PI/4, PI/2, PI]; print "Angles: $angles\n"; print "sin(angles): ", sin($angles), "\n"; print "cos(angles): ", cos($angles), "\n"; # 8. Creating ranges and sequences print "\n8. Creating ranges and sequences\n"; my $number_range = sequence(10); print "Sequence 0-9: $number_range\n"; my $zeros = zeros(5); print "Zeros (5): $zeros\n"; my $ones = ones(3, 3); print "Ones (3x3):\n$ones\n"; print "\n=== Sample script completed successfully! ===\n";
参考
- 公式サイト: https://pdl.perl.org/
- ドキュメント: https://metacpan.org/pod/PDL
- チュートリアル: https://pdl.perl.org/?page=documentation