Perl 如何使用pdl创建序列?

Perl 如何使用pdl创建序列?,perl,r,pdl,Perl,R,Pdl,我试图用pdl将我的部分R代码翻译成perl,我想知道pdl是否有创建序列的语法(除了我的$xx=pdl(1..20)) 比如有一个向量[a',b']rep20=>a,b,a,b,a,b。。。。20次? [编辑]: 基本的重复可以用普通的Perl repeat stringx操作符完成,但是我正在寻找 类似于R中的rep()和seq(): 我不知道任何特定于PDL的语法,但是使用Perl,您可以使用x操作符来重复列表中的元素。也许吧 $xx = pdl( ('a','b') x 20 );

我试图用pdl将我的部分R代码翻译成perl,我想知道pdl是否有创建序列的语法(除了我的$xx=pdl(1..20))

比如有一个向量[a',b']rep20=>a,b,a,b,a,b。。。。20次? [编辑]: 基本的重复可以用普通的Perl repeat string
x
操作符完成,但是我正在寻找 类似于R中的rep()和seq():


我不知道任何特定于PDL的语法,但是使用Perl,您可以使用
x
操作符来重复列表中的元素。也许吧

$xx = pdl(  ('a','b') x 20   );

会有用的。

好吧,我才刚刚开始使用PDL,但从我所看到和使用的情况来看,PDL似乎并不是制作序列所需要的。您最好将perl的范围运算符(
)与
map
grep
x
的任意组合使用

也就是说,如果你真的因为某种原因决定使用PDL,你可能会使用
sequence
函数,然后旋转这个小东西,直到它看起来像你想要的:

pdl> p sequence(10)

[0 1 2 3 4 5 6 7 8 9]


pdl> p sequence(2,4) #Slice column 1 for evens, 2 for odds.

[
 [0 1]
 [2 3]
 [4 5]
 [6 7]
]


pdl> p sequence(3,4) * 5 #Multiply to step by an amount.

[
 [ 0  5 10]
 [15 20 25]
 [30 35 40]
 [45 50 55]
]
您还可以使用切片来获取列,作为沿着序列进行步进的一种方式

对于其他任何事情,比如你在R示例中所做的事情,你需要开始发挥创造力:

pdl> p $a = (yvals zeroes(2,3))+1

[
 [1 1]
 [2 2]
 [3 3]
]

pdl> p pdl($a,$a,$a)->flat #-> rep(1:3, each=2, times=3)
[1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3]
(如果我知道如何更容易地复制矩阵,上述内容将更短) [编辑]这似乎很容易用dummy完成!
$a=(零(2,3)->yvals+1)->虚拟(2,3)->平面

再一次,除非您有特殊需要,否则我认为最好使用perl来生成序列

[编辑]以下是您的操作方法: 请注意,“
x
”不仅仅是一个字符串乘法器,它还可以乘法列表。您需要在变量周围显式地使用括号来通知perl列表中正在使用
x

#> rep(1:3, each=2, times=3)
my @s = map {($_) x 2} (1..3) x 3;

#> seq(0,12,3)
my @s = map {$_ * 3} 0..12/3;

#> rep(1:4, c(1,2,3,2))
#Ewww. So you basically want to multiply one list by another list.
#Here's one way to do it:
use List::MoreUtils qw(pairwise);
my @s = &pairwise(sub {($a) x $b}, [1..4], [1,2,3,2])

正如其他人所说,使用Perl编写一些示例并将其传递给
pdl
构造函数可能更容易。然而,最后一个例子很简单:

$x = 3*xvals(5);
print $x; # [0 3 6 9 12]
在做了一点工作之后,又不知道R,我想知道这个问题是否已经形成?我开始假设一些新的
pdl_rep
函数的输入是一个基本的piddle,然后是一些重复规范。然而,我开始怀疑自己,当基piddle的维度高于简单向量时,它应该做什么。因此,我决定只使用1D输入。然后我意识到,正如我和其他人所说的,要执行
c
每个
类型的操作,必须分离基本的piddle并在Perl级别操作元素并重建piddle,或者执行一些愚蠢的维度操作。所有这些的结果是,似乎构建这样一个函数的最简单方法就是让它本身成为pdl构造函数

一旦得出这个结论,我意识到,实际上,从构建良好的地图操作中构建您的皮德尔是您打算做的。PDL是为了从Perl的强大功能中获益,否则它将是一种独立的语言。这个
rep
函数可能没有被设计者实现,因为Perl已经有了它

可能是TL;DR,但我认为您的简短回答是让您的PDL也从Perl中受益

PDL没有特别的
seq()
rep()

具体来说,复制序列可以通过向原始数据中添加这些尺寸的虚拟尺寸,然后将结果重塑为1-D来完成

带有start:stop:stride的序列可以通过对可以使用sequence()构造函数生成的整数序列进行算术运算来生成

以下是一些PDL版本,它们对应于原始问题中的两个R代码片段,并附有解释对应关系的注释:

pdl> pdl(1..3)                  # 1:3
$PDL1 = [1 2 3];

pdl> pdl(1..3)->(*2)->flat      # rep(1:3, each=2)
$PDL1 = [1 1 2 2 3 3];

pdl> pdl(1..3)->(,*3)->flat     # rep(1:3, times=3)
$PDL1 = [1 2 3 1 2 3 1 2 3];

pdl> pdl(1..3)->(*2,,*3)->flat  # rep(1:3, each=2, times=3)
$PDL1 = [1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3];

pdl> rld(pdl(2,1,5),pdl(1..3))  # rep(1:3, c(2,1,5))
$PDL1 = [1 1 2 3 3 3 3 3];


pdl> sequence(13)->(0:12:3)     # seq(0,12,3)
$PDL1 = [0 3 6 9 12];
注意使用
rld
,运行长度解码命令来执行向量
rep
操作。使用这些类型的索引和维度操作来实现R例程是很简单的。此外,上面的操作主要用于整数索引操作。如果您需要对浮点数的支持,您需要做一些其他的事情

请参见
PDL::Basic
了解序列内容,参见
PDL::Slices
了解索引操作(
PDL::NiceSlice
也与此相关,因为这是上面使用的语法)。使用其中一个PDL shell可以很容易地尝试这类事情:
perldl
pdl2


PDL网站位于。有关PDL的更多讨论,请使用以加快PDL社区的响应。

以下是有关sequence()函数和矩阵的一些有趣的事情

$x = sequence(20)*2+1; ##odd
[1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39]
$x = sequence(20)*2;  ##even 
[0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38]
$x = sequence(20)%2; ## binary pattern
[0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1]
$x = sequence(20)%10  ## position matrix
[0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9]
$x = sequence(20)<=>10;  ## ray matrix
[-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 1 1 1 1 1 1 1 1 1]
$x = sequence(20)%4+2;  ## repeating pattern
[2 3 4 5 2 3 4 5 2 3 4 5 2 3 4 5 2 3 4 5]
$x = sequence(20)%6;  ##  notice how this is different 
[0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 0 1]
$x=序列(20)*2+1##古怪的
[1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39]
$x=序列(20)*2##即使
[0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38]
$x=序列(20)%2;##二进制模式
[0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1]
$x=序列(20)%10##位置矩阵
[0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9]
$x=序列(20)10;#射线矩阵
[-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 1 1 1 1 1 1 1 1 1]
$x=序列(20)%4+2;###重复模式
[2 3 4 5 2 3 4 5 2 3 4 5 2 3 4 5 2 3 4 5]
$x=序列(20)%6;##注意这是多么的不同
[0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 0 1]

+1代表你-1代表我不是一个好例子;-)。“x$times”填充了明显的perl解决方案的一部分(如“..”)。我在R中寻找类似于seq()和rep()的东西。请看我编辑的问题谢谢Joel+1,我只是在探索PDL对我的需求有多好,它可以节省我在perl中动态创建R代码和数据的时间,编写两个文件和qx(“R CMD my_script.R”)。您是对的,这些seq和rep函数可能可以在正常的perl中完成。那么我的问题是:有没有
$x = sequence(20)*2+1; ##odd
[1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39]
$x = sequence(20)*2;  ##even 
[0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38]
$x = sequence(20)%2; ## binary pattern
[0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1]
$x = sequence(20)%10  ## position matrix
[0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9]
$x = sequence(20)<=>10;  ## ray matrix
[-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 1 1 1 1 1 1 1 1 1]
$x = sequence(20)%4+2;  ## repeating pattern
[2 3 4 5 2 3 4 5 2 3 4 5 2 3 4 5 2 3 4 5]
$x = sequence(20)%6;  ##  notice how this is different 
[0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 0 1]