使用numpy的flatten_dtype和带有标题的结构化dtypes

时间:2010-08-17 01:06:06

标签: python numpy

我通常不会在这些论坛上发帖提问,但我搜遍了所有地方,但我没有发现任何关于这个问题的内容。

我正在使用结构化数组来存储实验数据。我正在使用标题来存储有关我的字段的信息,在这种情况下是度量单位。当我在我的dtype上调用numpy.lib.io.flatten_dtype()时,我得到:

ValueError: too many values to unpack  
File "c:\Python25\Lib\site-packages\numpy\lib\_iotools.py", line 78, in flatten_dtype
  (typ, _) = ndtype.fields[field]

我真的不在乎,除了numpy.genfromtxt()调用numpy.lib.io.flatten_dtype(),我需要能够从文本文件中导入我的数据。

我想知道我做错了什么。 flatten_dtype()是不是要支持游戏? genfromtxt()是否有解决办法?

以下是我的代码片段:

import numpy
fname = "C:\\Somefile.txt"
dtype = numpy.dtype([(("Amps","Current"),"f8"),(("Volts","Voltage"),"f8")])
myarray = numpy.genfromtxt(fname,dtype)

1 个答案:

答案 0 :(得分:1)

以下是可能的解决方法:

由于您的自定义dtype会导致问题,请改为提供展平的dtype:

In [77]: arr=np.genfromtxt('a',dtype='f8,f8')

In [78]: arr
Out[78]: 
array([(1.0, 2.0), (3.0, 4.0)], 
      dtype=[('f0', '<f8'), ('f1', '<f8')])

然后使用astype转换为您想要的dtype

In [79]: arr=np.genfromtxt('a',dtype='f8,f8').astype(dtype)

In [80]: arr
Out[80]: 
array([(1.0, 2.0), (3.0, 4.0)], 
      dtype=[(('Amps', 'Current'), '<f8'), (('Volts', 'Voltage'), '<f8')])

修改另一种选择是修补numpy.lib.io.flatten_dtype

import numpy
import numpy.lib.io
def flatten_dtype(ndtype):
    """
    Unpack a structured data-type.

    """
    names = ndtype.names
    if names is None:
        return [ndtype]
    else:
        types = []
        for field in names:
            typ_fields = ndtype.fields[field]
            flat_dt = flatten_dtype(typ_fields[0])
            types.extend(flat_dt)
        return types
numpy.lib.io.flatten_dtype=flatten_dtype