gpt4 book ai didi

perl - 将 PDL 分成两半

转载 作者:行者123 更新时间:2023-12-04 04:33:38 24 4
gpt4 key购买 nike

我有一个一维 PDL,我想对它的每一半进行计算;即拆分,然后对前半部分进行计算,对后半部分进行相同的计算。

有没有比获取元素数量(使用 nelem)、将其一分为二、然后进行两批切片更简单/更好/优雅的方法将 PDL 简单地分成两半?

谢谢

最佳答案

是的,只要你不需要直接调用 slice 来获得你想要的东西。你可以用这样的东西链接 splitdimdog:

# 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com