- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个一维 PDL,我想对它的每一半进行计算;即拆分,然后对前半部分进行计算,对后半部分进行相同的计算。
有没有比获取元素数量(使用 nelem)、将其一分为二、然后进行两批切片更简单/更好/优雅的方法将 PDL 简单地分成两半?
谢谢
最佳答案
是的,只要你不需要直接调用 slice 来获得你想要的东西。你可以用这样的东西链接 splitdim
和 dog
:
# Assume we have $data, a piddle
my ($left, $right) = $data->splitdim(0, $data->nelem/2)->dog;
当然,这很容易扩展到两个以上的部门。但是,如果您想将其扩展到更高维的 piddles(即所有存储在一个 piddle 中的时间序列的集合),您需要更巧妙一些。如果你想沿着第一个维度(索引为 0)拆分,你会这样说:
# Assume we have $data, a piddle
my ($left, $right) = $data->splitdim(0, $data->dim(0)/2)->mv(1, -1)->dog;
splitdim
操作将第 0 个维度拆分为两个维度,第 0 个维度的长度为 dim(0)/2,第 1 个维度的长度为 2(因为我们将其分为两部分)。由于 dog
在最后一个维度上操作,我们在调用 dog
之前将第一个维度移动到末尾。
但是,即使使用一维解决方案,也有一个警告。由于 $data->splitdim
的工作方式,如果您有奇数个元素,它将截断最后一段数据。在包含 21 个元素的 piddle 上尝试该操作,您就会明白我的意思:
my $data = sequence(20);
say "data is $data"; # lists 0-19
my ($left, $right) = $data->splitdim(0, $data->nelem/2)->dog;
say "left is $left and right is $right"; # lists 0-9, then 10-19
$data = sequence(21);
say "data is $data"; # lists 0-20, i.e. 21 elements
my ($left, $right) = $data->splitdim(0, $data->nelem/2)->dog;
say "left is $left and right is $right"; # lists 0-9, then 10-19!!
如果您想避免这种情况,您可以生成自己的方法,将第一个维度一分为二而不截断。它可能看起来像这样:
sub PDL::split_in_half {
my $self = shift;
# the int() isn't strictly necessary, but should make things a
# tad faster
my $left = $self->slice(':' . int($self->dim(0)/2-1) );
my $right = $self->slice(int($self->dim(0)/2) . ':');
return ($left, $right);
}
在这里,我还使用了内置的 int
来确保我们没有 .5
if dim(0)
很奇怪。它有点复杂,但我们将这种复杂性精确地隐藏到一个方法中,这样我们就不必考虑复杂性,所以我们不妨在我们这样做的时候给自己买几个时钟周期。
然后您可以轻松地调用该方法:
my ($left, $right) = $data->split_in_half;
关于perl - 将 PDL 分成两半,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20128532/
我有一个 AoA 哈希: $hash{$key} = [ [0.0,1.0,2.0], 10.0, [1.5,
我刚开始使用PDL,在文档中看到有两种可能的方式导入PDL的核心功能: use PDL::Core; use PDL::Core ':Internal'; 这里到底有什么区别?该文档对第二种方法进行了
我是 PDL 的新手,请原谅我的基本问题: 我有两个简单的 pdl 对象 pdl> p $a
我有一个二维 pdl,例如: my $data = random(4,4); 我想计算 pdl 上下文之外的 0,0 和 1,0 元素的总和。(不像,例如 $data->slice('0,0') +
我试图用 pdl 将我的 R 代码的一部分翻译成 perl,我想知道 pdl 是否有任何用于创建序列的语法(除了简单的我的 $xx=pdl(1..20)) 就像有一个向量 ['a','b'] rep
我有一个一维 PDL,我想对它的每一半进行计算;即拆分,然后对前半部分进行计算,对后半部分进行相同的计算。 有没有比获取元素数量(使用 nelem)、将其一分为二、然后进行两批切片更简单/更好/优雅的
我已经安装了PDL在 Mac OS X (10.7.3) 机器上。显然 SciPDL 安装程序将 PDL.pm 放在 /Library/Perl/5.12/darwin-thread-multi-2l
我在下面的代码中尝试 Perl 的 PDL: #!/usr/bin/perl -w use strict; use PDL::Core qw(pdl); use PDL::Math qw(isfin
具体来说,我想将 rcols 与 PERLCOLS 选项一起使用。 这是我想要做的: my @array; getColumn(\@array, $file, 4); # get the fourth
假设我有: $a = [ [1, 0, 1] [0, 1, 0] [0, 1, 1] ] 我想提取所有行 $row[2] == 1 .我得到的 piddl
我正在尝试在 Gtk3 应用程序中显示由 PDL(使用 PLplot)生成的图形。当我尝试以下代码时,我发现了两个问题: $pdlImg 不是 GdkPixbuf,所以 new_from_pixbuf
为了测试矩阵算法,我希望能够使用变量而不是数字进行计算,但不更改算法本身。 我认为存在解决方案(但可能还有其他同样受欢迎的解决方案)的方向是在 PDL 中使用多态性或将 PDL 库替换为具有与 PDL
是否有一个优雅的 PDL 函数,它接收一个值列表并返回一个包含 80% 的最低原始值的列表? 例如: 如果我有这样的列表: (9, 4, 1, 2, 7, 8, 3, 5, 6, 10) 在原始列表上
我最接近的是 use PDL; my $u = pdl [1,2,3,4]; my $dim = 4; for(my $i=0; $iflat->index($i), "\n"; } 也因为我可以转换
是否可以在 n 维上执行正则表达式 PDL 多变的? 例如,我可以通过执行将 100 添加到所有元素 $a1 = pdl [1,2]; print $a1 + 100; 但是,如果我的数组是一堆我想对
我想使用 Perl 和 PDL 来实现 3x3 矩阵的旋转(如果可能) 即原始矩阵 [ 1, 2, 3 ] [ 4, 5, 6 ] [ 7, 8, 9 ] 我想旋转,大约 5,所以它成为新的矩阵 [
我有一个非常好的 Perl 子例程,作为 Perl 模块的一部分编写。在不涉及太多细节的情况下,它需要一个字符串和一个短列表作为参数(通常从终端获取)并吐出一个值(现在总是一个浮点,但情况可能并不总是
我是 Moose 的新手并且做得很好,直到我使用 PDL 作为属性遇到了障碍。我希望能够将对象写入文件(我一直在使用 use MooseX::Storage; with Storage('io' =>
我尝试像在 PDL 矩阵或 Vector 数组上做一个 grep: my @toto; push(@toto, pdl(1,2,3)); push(@toto, pdl(4,5,6)); my $ti
我有一个使用 PDL 的函数.最后一步是点积,因此它返回一个标量。但是,当我尝试打印这个标量时,它显然仍然是一个小玩意,并在屏幕上打印如下: [ [ 3 ] ] 我想知道如何将它转换回常规的 Pe
我是一名优秀的程序员,十分优秀!