我正在尝试使用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')]))
列的数量和名称取决于输入表。它定义了用户。为什么不能在脚本中定义列的数量和名称。
有谁知道如何解决这个问题? 提前致谢
答案 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')])
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