2016-01-05 29 views
3

我試圖用我所定義的名稱定義列名的

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'] 

的名單,然後np.dtype

指定列名列表「數據類型不理解」錯誤,陣列串

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
>>> 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是一個unicode列表,那麼您需要先對它們進行編碼。
+0

日Thnx非常@unutbu – kamfulebu

+0

完美。再次感謝:) – kamfulebu

+0

當您使用字典方法時,您可以使用unicode對象作爲字段名稱:https://stackoverflow.com/a/45936203/1025391 – moooeeeep

1

我剛剛偶然發現了這個問題。

當從這樣一個unicode對象定義一個字段名,則收到錯誤(如在對方的回答解釋):

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

有趣的是,當創建使用字典方法相同的D型對象,它的工作原理:

>>> 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