【问题标题】:Saving numpy arrays as a dictionary将numpy数组保存为字典
【发布时间】:2018-11-03 21:02:28
【问题描述】:

我将 2 个 Numpy 数组保存为字典。
当我从二进制文件加载数据时,我得到另一个ndarray。我可以将加载的 Numpy 数组用作字典吗?

这是我的代码和脚本的输出:

import numpy as np

x = np.arange(10)
y = np.array([100, 101, 102, 103, 104, 105, 106, 107])
z = {'X': x, 'Y': y}
np.save('./data.npy', z)
z1 = np.load('./data.npy')
print(type(z1))
print(z1)
print(z1['X']) #this line will generate an error

输出:{'X': array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), 'Y': array([100, 101, 102, 103, 104, 105, 106, 107])}

【问题讨论】:

  • 我使用pickle 来保存字典。真的很容易使用
  • ...什么错误?
  • 您是否注意到在生成错误时您使用了大写 Z 而不是 z?
  • np.save 保存数组。如果给定其他结构,它首先将其包装在对象 dtype 数组中。 pickle 可以直接保存字典,并在内部使用save 来写入数组。其实save使用pickle来处理保存的字典部分。

标签: python arrays numpy dictionary


【解决方案1】:

另一种存储numpy 数组的未充分利用的方法是HDF5。好处是:

  • 可移植性,即不像pickle那样特定于Python
  • 能够访问内存不足的数据和用于优化的分块选项
  • 用于优化读取或写入性能的压缩选项

这是一个演示:

import h5py, numpy as np

x = np.arange(10)
y = np.array([100, 101, 102, 103, 104, 105, 106, 107])
z = {'X': x, 'Y': y}

with h5py.File('file.h5', 'w', libver='latest') as f:  # use 'latest' for performance
    for k, v in z.items():
        f.create_dataset('dict/'+str(k), data=v)

with h5py.File('file.h5', 'r', libver='latest') as f:
    x_read = f['dict']['X'][:]  # [:] syntax extracts numpy array into memory
    y_read = f['dict']['Y'][:]

print(x_read)

array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

【讨论】:

    【解决方案2】:

    z1 访问数据的另一个选项应该是:

    z1.flatten()[0]['X']
    

    【讨论】:

    • 也就是说,将0d数组变成1d数组,并使用[(0,)]索引而不是[()],索引表达式的参数始终是一个元组,无论()是明确与否。
    【解决方案3】:

    是的,您可以访问 0 维数组中的底层字典。试试z1[()]

    这是一个演示:

    np.save('./data.npy', z)
    d = np.load('./data.npy')[()]
    
    print(type(d))
    <class 'dict'>
    
    print(d['X'])
    [0 1 2 3 4 5 6 7 8 9]
    

    【讨论】:

      猜你喜欢
      • 2015-01-04
      • 2018-05-28
      • 2019-05-29
      • 2020-09-16
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      相关资源
      最近更新 更多