'数据类型不理解'定义列名列表时出错

时间:2016-01-05 01:48:12

标签: python numpy

我正在尝试使用np.dtype

指定列名

我已经定义了一个名单

print fieldNameList

[u'A', u'B', u'C', u'D', u'E', u'F', u'G', u'H', u'I', u'J', u'K', u'L', u'M', u'N', u'S']

然后,数组到字符串

field_name = ', '.join(["('%s', '<f8')" % w for w in fieldNameList])

print field_name

('A', '<f8'), ('B', '<f8'), ('C', '<f8'), ('D', '<f8'), ('E', '<f8'), ('F', '<f8'), ('G', '<f8'), ('H', '<f8'), ('I', '<f8'), ('J', '<f8'), ('K', '<f8'), ('L', '<f8'), ('M', '<f8'), ('N', '<f8'), ('S', '<f8')

然后

inarray = np.array(tup1,
                np.dtype([field_name]))

我收到错误

np.dtype([field_name]))
TypeError: data type not understood

当代替变量时,输入生成的field_name得到所需的结果

inarray = np.array(tup1,
            np.dtype([('A', '<f8'), ('B', '<f8'), ('C', '<f8'), ('D', '<f8'), ('E', '<f8'), ('F', '<f8'), ('G', '<f8'), ('H', '<f8'), ('I', '<f8'), ('J', '<f8'), ('K', '<f8'), ('L', '<f8'), ('M', '<f8'), ('N', '<f8'), ('S', '<f8')]))

列的数量和名称取决于输入表。它定义了用户。为什么不能在脚本中定义列的数量和名称。

有谁知道如何解决这个问题? 提前致谢

2 个答案:

答案 0 :(得分:2)

>>> field_name = ', '.join(["('%s', '<f8')" % w for w in fieldNameList])
>>> field_name
"('A', '<f8'), ('B', '<f8'), ('C', '<f8')"

使field_name成为一个字符串。 [field_name]是包含一个字符串的列表。 相反,NumPy dtype可以指定为元组列表:

>>> [(w, '<f8') for w in fieldNameList]
[('A', '<f8'), ('B', '<f8'), ('C', '<f8')]
fieldNameList = [u'A', u'B', u'C']
fieldNameList = [name.encode('utf-8') for name in fieldNameList]        # 1
tup1 = [(1,2,3)]
inarray = np.array(tup1, dtype=[(w, '<f8') for w in fieldNameList])

产量

array([(1.0, 2.0, 3.0)], 
      dtype=[('A', '<f8'), ('B', '<f8'), ('C', '<f8')])
  1. 请注意fieldNameList必须是字节字符串列表 - 而不是unicode。 如果fieldNameList是一个unicodes列表,那么您需要先对它们进行编码。

答案 1 :(得分:1)

我自己偶然发现了这个问题。

当您从这样的unicode对象定义字段名称时,会收到错误(如另一个答案中所述):

>>> np.dtype([(u'foo', 'f')])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: data type not understood

有趣的是,当您使用字典方法创建相同的dtype对象时,它可以工作:

>>> np.dtype({'names': [u"foo"], 'formats': ["f"]})
dtype([(u'foo', '<f4')])

记录:我使用的是Python 2.7.6,numpy 1.13.1。 Python 3.4.3中不存在此问题。

以下是github numpy问题跟踪器中的相应条目:https://github.com/numpy/numpy/issues/2407