2011-11-05 31 views
3

numpy中是否有函數確定字符串是否應該是整數或浮點數並自動轉換它們?例如,我經常使用str.strip()str.split()的組合來從文本文件中解析記錄的集合。然後,我得到的東西像自動檢測/轉換數據類型?

List = [['1','a','.3'], 
     ['2','b','-.5']] 

上,然後使用numpy.rec.fromrecords轉換:

In [1227]: numpy.rec.fromrecords(List) 
Out[1227]: 
rec.array([('1', 'a', '.3'), ('2', 'b', '-.5')], 
     dtype=[('f0', '|S1'), ('f1', '|S1'), ('f2', '|S3')]) 

在R,有一個叫type.convert功能,其向量/字符串的列被通過,這將決定什麼該列的類型應該是(即如果它是字符串和數字的混合,它將保持一個字符向量)。 Excel也這樣做(基於前6個元素,如果我沒記錯的話)...

NumPy/Python中是否有這樣的函數?我知道我可以編寫一個函數來測試列中的每個元素是否可以轉換爲整數等等,但是有什麼內置的?我知道在所有的例子中,處方是明確指定dtypes,但我想跳過這一步。謝謝。如果設置dtype=None

回答

5

numpy.genfromtxt可以猜測dtypes:

import numpy as np 
import io 

alist = [['1','a','.3'], 
     ['2','b','-.5']] 

f = io.BytesIO('\n'.join(' '.join(row) for row in alist)) 
arr = np.genfromtxt(f,dtype=None) 
print(arr) 
print(arr.dtype) 
# [(1, 'a', 0.3) (2, 'b', -0.5)] 
# [('f0', '<i4'), ('f1', '|S1'), ('f2', '<f8')] 

注意,倒不如直接申請np.genfromtxt到文本文件,而不是創建中間列表List(或我稱之爲alist)的。如果您在將文件發送到np.genfromtxt之前需要對文件進行一些處理,則可以在可執行處理的文件周圍製作一個file-like object wrapper,並將其傳遞到np.genfromtxt

+1

這是一個非常有趣的解決方案!看起來有點間接......但也許這仍然是最好的方法...... – hatmatrix

+0

實際上,對象包裝器的概念相當有用,就像'io.BytesIO'技巧一樣。我查看了源代碼以提取進行轉換的部分,但它看起來並不那麼直接,因爲它不是'np.genfromtxt'中的模塊化組件。這似乎是最好的。 – hatmatrix