【问题标题】:Can fromfile omit fields?fromfile 可以省略字段吗?
【发布时间】:2020-01-11 17:51:15
【问题描述】:

我正在从给定的二进制格式读取数据,但是我只对字段的一个子集感兴趣。

例如:

MY_DTYPE = np.dtype({'names': ('A', 'B', 'C'), 'formats': ('<f8', '<u2', 'u1')})

data = np.fromfile(infile, count=-1, dtype=MY_DTYPE)

假设我真的不需要data['C'],是否可以首先指定我要保留哪些字段?

【问题讨论】:

  • 加载后删除。

标签: numpy fromfile


【解决方案1】:

模拟负载:

In [117]: MY_DTYPE = np.dtype({'names': ('A', 'B', 'C'), 'formats': ('<f8', '<u2', 'u1')})                   
In [118]: data = np.zeros(3, MY_DTYPE)                                                                       
In [119]: data                                                                                               
Out[119]: 
array([(0., 0, 0), (0., 0, 0), (0., 0, 0)],
      dtype=[('A', '<f8'), ('B', '<u2'), ('C', 'u1')])
In [120]: data['C']                                                                                          
Out[120]: array([0, 0, 0], dtype=uint8)

在最新的 numpy 版本中,多字段索引创建 view:

In [121]: data[['A','B']]                                                                                    
Out[121]: 
array([(0., 0), (0., 0), (0., 0)],
      dtype={'names':['A','B'], 'formats':['<f8','<u2'], 'offsets':[0,8], 'itemsize':11})

它提供了一个repack_fields函数来制作一个正确的copy

In [122]: import numpy.lib.recfunctions as rf                                                                
In [123]: rf.repack_fields(data[['A','B']])                                                                  
Out[123]: array([(0., 0), (0., 0), (0., 0)], dtype=[('A', '<f8'), ('B', '<u2')])

有关更多信息,请参阅repack 的文档,或查看最近的发行说明。

【讨论】:

  • 感谢您的回答,这是否意味着data 和新副本同时在内存中?
  • Out[121] 是一个view,但Out[123] 是一个copy,一个新数组。它不会取代data
  • 我遇到了一个我想解决的内存问题,如果某些字段一开始就没有存储,我可以加载更多。
猜你喜欢
  • 2017-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
  • 2014-06-19
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多