簡體   English   中英

調用 numpy 數組時,“[()]”是什么意思?

[英]What does "[()]" mean when called upon a numpy array?

我剛剛遇到了這段代碼:

x = np.load(lc_path, allow_pickle=True)[()]

我以前從未見過這種模式: [()] 它有什么作用,為什么這在語法上是正確的?


a = np.load(lc_path, allow_pickle=True)
>>> array({'train_ppls': [1158.359413193576, 400.54333992093854, ...],
 'val_ppls': [493.0056070137404, 326.53203520368623, ...],
 'train_losses': [340.40905952453613, 675.6475067138672, ...],
 'val_losses': [217.46258735656738, 438.86770486831665, ...],
 'times': [19.488852977752686, 20.147733449935913, ...]}, dtype=object)

所以我猜a是保存它的人出於某種原因包裝在數組中的dict

這是索引 0d 數組的一種方式(唯一方式):

In [475]: x=np.array(21)                                                                       
In [476]: x                                                                                    
Out[476]: array(21)
In [477]: x.shape                                                                              
Out[477]: ()
In [478]: x[()]                                                                                
Out[478]: 21

實際上,它將元素從數組中拉出。 item()是另一種方式:

In [479]: x.item()                                                                             
Out[479]: 21
In [480]: x.ndim                                                                               
Out[480]: 0

x = np.load(lc_path, allow_pickle=True)[()]

很可能np.save被賦予了一個非數組; 並包裝在一個 0d 對象 dtype 數組中以保存它。 這是恢復該對象的一種方式。

In [481]: np.save('test.npy', {'a':1})                                                         
In [482]: x = np.load('test.npy', allow_pickle=True)                                           
In [483]: x                                                                                    
Out[483]: array({'a': 1}, dtype=object)
In [484]: x.ndim                                                                               
Out[484]: 0
In [485]: x[()]                                                                                
Out[485]: {'a': 1}

一般來說,當我們索引一個 nd 數組時,例如x[1,2]我們實際上是在做x[(1,2)] ,也就是說,使用對應於維數的元組。 如果x是 0d,則唯一有效的元組是空元組()

那是用 0 個索引的元組對數組進行索引。 對於大多數數組,這只會生成整個數組的視圖,但對於 0 維數組,它將數組的單個元素提取為標量。

在這種情況下,看起來有人做出了奇怪的選擇,將非 NumPy 對象轉儲到numpy.save數組,導致 NumPy 保存了一個 0 維object numpy.save數組,該數組包含原始對象。 使用allow_pickle=True和空元組索引從 0 維數組中提取對象。

他們可能應該選擇numpy.save以外的其他東西來保存這個對象。

暫無
暫無

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

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