Learn the basics of PDL
I would like to write an introduction to PDL so that people who are doing statistical analysis in R language can perform statistical analysis work using PDL in Perl. If PDL, Perl's statistical analysis library, becomes available, it will be possible to perform statistical processing of multi-column data as in Excel.
First, let's create the simplest one-dimensional data structure. Take a look at the following code. You can use the pdl function to create a one-dimensional data structure.
use strict; use warnings; use PDL; # Create data my $nums = pdl [2, 4, 7]; # Data output print $nums;
When I run this example, I get the following output on the screen:
[2 4 7]
Creating PDL variable
You can first create a PDL variable using the pdl function. First, load the PDL to use the minimum functions of the PDL.
use PDL;
After loading the PDL, you can use the pdl function. Use the pdl function to create a PDL variable.
my $nums = pdl [2, 4, 7];
Data acquisition and modification
The data created by the pdl function is called a PDL variable. Let's get the elements of a one-dimensional PDL variable. Use the at method to get the data.
my $first = $nums->at(0); my $second = $nums->at(1);
In the above example, we got the value of the element contained in the PDL variable, but we can also get it as a PDL variable.
There are several ways to get some data as PDL variable, but it's easier to write in nice slice notation. Read the PDL::NiceSlice module for writing nice slice notation. This is done at the beginning of the script.
use PDL::NiceSlice;
To get an element as a PDL variable, use the notation $variable name (index) .
# Get element as PDL variable my $pdl_first = $nums (0); my $pdl_second = $nums (1);
These are PDL variable, so if you want to get the element value itself, you can retrieve it with the at method.
my $first = $pdl_first->at(0); my $second = $pdl_second->at(0);
If you want to change the value of an element, use nice slice notation as well. Use the . = operator. . = Is overridden for assignment, not string concatenation.
# Change the value of the element $nums (0). = 5;
PDL also allows you to extract multiple parts of a PDL variable as a new PDL variable. Let's extract the second and third elements. You can extract a part of the PDL variable by using the notation $variable name (n: m) as follows.
my $pdl_parts = $nums (1: 2);
You can also assign values to all the elements of the extracted PDL variable.
$nums (1: 2). = 8;
The feature of PDL is that the same operation can be performed on the set of parts extract in this way.
Let's get the length of one-dimensional data. Use the dims method to get the length of the data.
my $length = $nums->dims;
Example
This is an example that can be executed.
use strict; use warnings; use PDL; use PDL::NiceSlice; # Create data my $nums = pdl [2, 4, 7]; # Element output print $nums->at(0) . "\n"; print $nums->at(1) . "\n"; # Retrieving PDL variable my $pdl_first = $nums (0); my $pdl_second = $nums (1); # Substitution $nums (0). = 5; # Getting multi-element PDL variable my $pdl_parts = $nums (1: 2); # Assignment to multiple elements retrieved as PDL variable $nums (1: 2). = 8; print $nums . "\n";
Four arithmetic operations of constants
Use the + operator to add the same value to all values of a PDL variable .
use PDL; my $pdl = pdl [1, 1, 2, 2, 2, 3]; my $pdl_add = $pdl + 3;
Do the same for subtraction , multiplication , division , quotient , and exponentiation . can do.
# Subtraction my $pdl_sub = $pdl - 3; # Multiplication my $pdl_product = $pdl * 3; # Division my $pdl_div = $pdl/3; # Quotient my $pdl_quotient = $pdl % 3; # Exponentiation my $pdl_pow = $pdl + 3;
Multiplication and division correspond to constant multiples of the vector. Keep in mind that you are doing operations between PDL variable and ordinary values, not operations between PDL variable.
Extract unique values
Use the uniq method to retrieve the unique value .
my $pdl_uniq = $pdl->uniq;
Four arithmetic operations between PDL variable
To add PDL variable , use the + operator for PDL variable. Each element is added.
# Addition of PDL variable my $pdl1 = pdl [1, 2, 3]; my $pdl2 = pdl [4, 5, 6]; my $pdl_add = $pdl1 + $pdl2;
Do the same for subtraction , multiplication , division , quotient , and exponentiation . can do. Each element is calculated.
# Subtraction my $pdl_sub = $pdl1-$pdl2; # Multiplication my $pdl_product = $pdl1 * $pdl2; # Division my $pdl_div = $pdl1/$pdl2; # Quotient my $pdl_quotient = $pdl1 %$pdl2; # Exponentiation my $pdl_pow = $pdl1 + $pdl2;
Addition and subtraction corresponds to addition and subtraction of vectors.
Dot product
There is no special way to calculate the dot product. To calculate the inner product , multiply the PDL variable and then find the sum.
# Dot product my $inner_product = ($pdl1 * $pdl2)->sum;
The result of the dot product is just a value, not a PDL variable.
Example
This is an example that can be executed.
use strict; use warnings; use PDL; # Addition my $pdl = pdl [1, 1, 2, 2, 2, 3]; my $pdl_add = $pdl + 3; # Subtraction my $pdl_sub = $pdl - 3; # Multiplication my $pdl_product = $pdl * 3; # Division my $pdl_div = $pdl/3; # Quotient my $pdl_quotient = $pdl % 3; # Get unique value my $pdl_uniq = $pdl->uniq; # Calculation result print "$pdl_add\n"; print "$pdl_sub\n"; print "$pdl_product\n"; print "$pdl_div\n"; print "$pdl_quotient\n"; print "$pdl_uniq\n";
use strict; use warnings; use PDL; # Addition of PDL variable my $pdl1 = pdl [1, 2, 3]; my $pdl2 = pdl [4, 5, 6]; my $pdl_add = $pdl1 + $pdl2; # Subtraction my $pdl_sub = $pdl1-$pdl2; # multiplication my $pdl_product = $pdl1 * $pdl2; # Division my $pdl_div = $pdl1/$pdl2; # Quotient my $pdl_quotient = $pdl1 %$pdl2; # Exponentiation my $pdl_pow = $pdl1 + $pdl2; # Dot product my $inner_product = ($pdl1 * $pdl2)->sum; # Calculation result print "$pdl_add\n"; print "$pdl_sub\n"; print "$pdl_product\n"; print "$pdl_div\n"; print "$pdl_quotient\n"; print "$inner_product\n";