Pea*_*cer 56 python numpy hdf5 stata pandas
统计软件Stata允许将短文本片段保存在数据集中.这可以使用notes和/或完成characteristics.
这对我来说是一个很有价值的功能,因为它允许我保存各种信息,从提醒和待办事项列表到有关我如何生成数据的信息,甚至是特定变量的估算方法.
我现在正试图在Python 3.6中提出类似的功能.到目前为止,我已经在线查看了一些帖子,但这些帖子并没有完全解决我想做的事情.
一些参考文章包括:
对于小型NumPy数组,我得出结论,函数numpy.savez()和a 的组合dictionary可以在单个文件中充分存储所有相关信息.
例如:
a = np.array([[2,4],[6,8],[10,12]])
d = {"first": 1, "second": "two", "third": 3}
np.savez(whatever_name.npz, a=a, d=d)
data = np.load(whatever_name.npz)
arr = data['a']
dic = data['d'].tolist()
Run Code Online (Sandbox Code Playgroud)
但问题仍然存在:
是否有更好的方法可以将其他信息包含在包含NumPy数组或(大)的文件中Pandas DataFrame?
我在听到有关特定特别感兴趣的优点和缺点,你可能有例子的任何建议.依赖性越少越好.
jpp*_*jpp 29
有很多选择.我将只讨论HDF5,因为我有使用这种格式的经验.
优点:可移植(可在Python之外读取),本机压缩,内存不足功能,元数据支持.
缺点:依赖于单个低级C API,数据损坏作为单个文件的可能性,删除数据不会自动减小大小.
根据我的经验,为了性能和可移植性,避免 pyTables/HDFStore存储数字数据.您可以使用提供的直观界面h5py.
存储一个数组
import h5py, numpy as np
arr = np.random.randint(0, 10, (1000, 1000))
f = h5py.File('file.h5', 'w', libver='latest') # use 'latest' for performance
dset = f.create_dataset('array', shape=(1000, 1000), data=arr, chunks=(100, 100),
compression='gzip', compression_opts=9)
Run Code Online (Sandbox Code Playgroud)
压缩和分块
有许多压缩选择,例如blosc,lzf分别是压缩和解压缩性能的良好选择.注意gzip是原生的; 默认情况下,您的HDF5安装可能无法提供其他压缩过滤器.
分块是另一种选择,当与读取数据内存时的方式一致时,可以显着提高性能.
添加一些属性
dset.attrs['Description'] = 'Some text snippet'
dset.attrs['RowIndexArray'] = np.arange(1000)
Run Code Online (Sandbox Code Playgroud)
存储字典
for k, v in d.items():
f.create_dataset('dictgroup/'+str(k), data=v)
Run Code Online (Sandbox Code Playgroud)
内存不足
dictionary = f['dictgroup']
res = dictionary['my_key']
Run Code Online (Sandbox Code Playgroud)
没有什么可以替代阅读h5py 文档,它暴露了大多数C API,但您应该从上面看到有很大的灵活性.
我同意JPP的说法,hdf5存储在这里是个不错的选择.他和我的解决方案之间的区别是我使用Pandas数据帧而不是numpy数组.我更喜欢数据框,因为它允许混合类型,多级索引(甚至是日期时间索引,这对我的工作非常重要),以及列标记,这有助于我记住不同数据集的组织方式.此外,熊猫提供了一系列内置功能(非常像numpy).使用Pandas的另一个好处是它内置了一个hdf创建器(即pandas.DataFrame.to_hdf),我觉得它很方便
将数据帧存储到h5时,您可以选择存储元数据字典,这可以是您自己的注释,也可以是不需要存储在数据帧中的实际元数据(我也使用它来设置标记,例如{'is_agl':True,'scale_factor':100,'already_corrected':False等.}.在这方面,使用numpy数组和数据帧之间没有区别.对于完整的解决方案,请参阅 我原来的问题和解决方案在这
一种实用的方法是将元数据直接嵌入Numpy数组中。好处是,正如您所希望的那样,没有额外的依赖关系,并且在代码中使用非常简单。但是,这并不能完全回答您的问题,因为您仍然需要一种保存数据的机制,因此我建议使用HDF5 使用jpp的解决方案。
要在中包含元数据,文档中ndarray有一个示例。你基本上有一个子类,并添加一个字段或或什么的。ndarrayinfometadata
它会给出(来自上面链接的代码)
import numpy as np
class ArrayWithInfo(np.ndarray):
def __new__(cls, input_array, info=None):
# Input array is an already formed ndarray instance
# We first cast to be our class type
obj = np.asarray(input_array).view(cls)
# add the new attribute to the created instance
obj.info = info
# Finally, we must return the newly created object:
return obj
def __array_finalize__(self, obj):
# see InfoArray.__array_finalize__ for comments
if obj is None: return
self.info = getattr(obj, 'info', None)
Run Code Online (Sandbox Code Playgroud)
要通过保存数据numpy,您需要使write函数过载或使用其他解决方案。
| 归档时间: |
|
| 查看次数: |
9919 次 |
| 最近记录: |