簡體   English   中英

訪問 PDL 對象中數據的最佳實踐

[英]Best practice for accessing data in PDL objects

我有一個二維 pdl,例如:

my $data  = random(4,4);

我想計算 pdl 上下文之外的 0,0 和 1,0 元素的總和。 (不像,例如$data->slice('0,0') + $data->slice('1,0) ,它仍然返回一個 pdl 對象)這樣做的正確方法是什么?

如果您希望將單個元素提取為普通的 Perl 標量,請使用at而不是slice

pdl> $pdl = random(4,4)
pdl> p $pdl->at(0,0) + $pdl->at(1,0)
0.288796754210711
pdl> p ref \($pdl->at(0,0) + $pdl->at(1,0))
SCALAR

要將整個 ndarray 對象轉換為嵌套的 Perl 數組,請使用unpdl

pdl> $aoa = random(4,4)->unpdl;
pdl> p ref $aoa
ARRAY
pdl> p ref $aoa->[0]
ARRAY

請注意,Perl 數組中元素的索引是 ndarray 對象中的橫向索引。 例如,

pdl> p $pdl->at(1,0)
0.111869023064209

pdl> p $aoa->[1][0] # wrong
0.954887281829823

pdl> p $aoa->[0][1] # correct
0.111869023064209

迪亞布的回答非常適合所提出的問題。 但是,由於問題包括詢問“最佳實踐”,我建議通常在使用 PDL 時,應考慮以數組編程風格一次對所有內容進行操作,和/或考慮在給定更高時您的代碼將如何操作維ndarrays(即它將如何“廣播”)。

一種使給定代碼廣播的方法,以便它將返回一個 4x4 的 1 元素 ndarray,但如果給定 4x4x3 ndarray,則返回一個 3 元素:

use PDL;
sub sum_top_left { $_[0]->slice('(0),0:1')->sumover }
print $data = sequence(4,4) + 3;
print sum_top_left($data);
print $data = sequence(4,4,3) + 3;
print sum_top_left($data);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM