【问题标题】:What does "[()]" mean when called upon a numpy array?当调用一个 numpy 数组时,“[()]”是什么意思?
【发布时间】:2020-07-06 15:10:51
【问题描述】:

我刚刚遇到了这段代码:

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 被保存它的人出于某种原因包装在一个数组中

【问题讨论】:

标签: python numpy


【解决方案1】:

这是索引 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}

一般来说,当我们索引一个数组时,例如x[1,2]我们真的是在做x[(1,2)],也就是使用一个对应维数的元组。如果x 为0d,则唯一有效的元组是一个空元组()

【讨论】:

    【解决方案2】:

    这是用 0 个索引的元组对数组进行索引。对于大多数数组,这只会生成整个数组的视图,但对于 0 维数组,它会将数组的单个元素提取为标量。

    在这种情况下,看起来有人做出了奇怪的选择,将非 NumPy 对象转储到带有 numpy.save 的数组中,从而导致 NumPy 保存了一个包含原始对象的 object dtype 的 0 维数组。使用allow_pickle=True和空元组索引从0维数组中提取对象。

    他们可能应该选择numpy.save 以外的其他东西来保存这个对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-04
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 2014-01-31
      • 1970-01-01
      相关资源
      最近更新 更多