【问题标题】:What is the way data is stored in *.npy?数据在 *.npy 中的存储方式是什么?
【发布时间】:2011-05-04 15:43:36
【问题描述】:

我正在使用 numpy.save 函数保存 NumPy 数组。 我希望其他开发人员能够使用 C 语言从这些文件中读取数据。 所以我需要知道,numpy 如何在文件中组织二进制数据。好的,当我保存“i4”数组时很明显,但是包含一些结构的数组数组呢?在文档中找不到任何信息

UPD: 假设数据类似于:

dt = np.dtype([('outer','(3,)<i4'),('outer2',[('inner','(10,)<i4'),('inner2','f8')])])

UPD2:如何保存“动态”数据(dtype - 对象)

import numpy as np
a = [0,0,0]
b = [0,0]
c = [a,b]
dtype = np.dtype([('Name', '|S2'), ('objValue', object)])
data = np.zeros(3, dtype)
data[0]['objValue'] = a
data[1]['objValue'] = b
data[2]['objValue'] = c
data[0]['Name'] = 'a'
data[1]['Name'] = 'b'
data[2]['Name'] = 'c'

np.save(r'D:\in.npy', data)

从 C 中读取那个东西是真的吗?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    npy 文件格式记录在 numpy 的 NEP 1 — A Simple File Format for NumPy Arrays 中。

    比如代码

    >>> dt=numpy.dtype([('outer','(3,)<i4'),
    ...                 ('outer2',[('inner','(10,)<i4'),('inner2','f8')])])
    >>> a=numpy.array([((1,2,3),((10,11,12,13,14,15,16,17,18,19),3.14)),
    ...                ((4,5,6),((-1,-2,-3,-4,-5,-6,-7,-8,-9,-20),6.28))],dt)
    >>> numpy.save('1.npy', a)
    

    文件中的结果:

    93 4E 55 4D 50 59                      magic ("\x93NUMPY")
    01                                     major version (1)
    00                                     minor version (0)
    
    96 00                                  HEADER_LEN (0x0096 = 150)
    7B 27 64 65 73 63 72 27 
    3A 20 5B 28 27 6F 75 74 
    65 72 27 2C 20 27 3C 69 
    34 27 2C 20 28 33 2C 29 
    29 2C 20 28 27 6F 75 74 
    65 72 32 27 2C 20 5B 28 
    27 69 6E 6E 65 72 27 2C 
    20 27 3C 69 34 27 2C 20 
    28 31 30 2C 29 29 2C 20 
    28 27 69 6E 6E 65 72 32                Header, describing the data structure
    27 2C 20 27 3C 66 38 27                "{'descr': [('outer', '<i4', (3,)),
    29 5D 29 5D 2C 20 27 66                            ('outer2', [
    6F 72 74 72 61 6E 5F 6F                               ('inner', '<i4', (10,)), 
    72 64 65 72 27 3A 20 46                               ('inner2', '<f8')]
    61 6C 73 65 2C 20 27 73                            )],
    68 61 70 65 27 3A 20 28                  'fortran_order': False,
    32 2C 29 2C 20 7D 20 20                  'shape': (2,), }"
    20 20 20 20 20 20 20 20 
    20 20 20 20 20 0A 
    
    01 00 00 00 02 00 00 00 03 00 00 00    (1,2,3)
    0A 00 00 00 0B 00 00 00 0C 00 00 00
    0D 00 00 00 0E 00 00 00 0F 00 00 00
    10 00 00 00 11 00 00 00 12 00 00 00
    13 00 00 00                            (10,11,12,13,14,15,16,17,18,19)
    1F 85 EB 51 B8 1E 09 40                3.14
    
    04 00 00 00 05 00 00 00 06 00 00 00    (4,5,6)
    FF FF FF FF FE FF FF FF FD FF FF FF
    FC FF FF FF FB FF FF FF FA FF FF FF
    F9 FF FF FF F8 FF FF FF F7 FF FF FF 
    EC FF FF FF                            (-1,-2,-3,-4,-5,-6,-7,-8,-9,-20)
    1F 85 EB 51 B8 1E 19 40                6.28
    

    【讨论】:

    • 谢谢,这是最简单的示例
    • 包含一些结构的数组数组呢?在这种情况下数据的顺序是什么?在您的示例矩阵元素按行存储,很明显,我想知道 numpy 如何存储复杂数据
    • @taras:查看更新。如果还不够复杂,您应该编辑您的问题以显示它的复杂程度(示例数据)。
    • npy-format 的 URL 不再起作用。新网址为:github.com/numpy/numpy/blob/master/doc/neps/npy-format.txt
    • @BmyGuest 已更改为永久链接。
    【解决方案2】:

    格式在numpy/lib/format.py中进行了描述,您还可以在其中看到用于加载 npy 文件的 Python 源代码。 np.load 定义为 here

    【讨论】:

      猜你喜欢
      • 2021-10-22
      • 2013-07-22
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      相关资源
      最近更新 更多