簡體   English   中英

將文本文件的每一行加載為 numpy 數組而不循環

[英]Loading each line of text file as numpy array without looping

我有包含用於頻繁規則挖掘的數據的數據集,其中每一行都有不同數量的項目,例如

9 10 5
8 9 10 5 12 15
7 3 5

有沒有一種方法可以一次讀取具有上述內容的文件並將其轉換為arraysnumpy array ,如 np.array(np.array([

array([array([ 9, 10,  5]), array([ 8,  9, 10,  5, 12, 15]),
       array([7, 3, 5])], dtype=object)

我遇到過numpy.loadtxt function 但它不能滿足我想要的不同數量的列。 對於不同數量的列, loadtxt需要提及用於讀取數據的列。 但是,我想讀取每一行中的所有值。
實現此目的的一種方法是手動讀取文件並將每一行轉換為numpy 'array`,但我不想采用這種方法,因為實際數據集將比此處顯示的小示例大得多。 例如,我打算使用來自FIMI 存儲庫的數據集。 一個樣本數據是事故數據
編輯:我使用以下代碼來實現我想要的

data = []
# d = np.loadtxt('datasets/grocery.dat')
with open('datasets/accidents.dat', 'r') as f:
    for l in f.readlines():
        ar = np.genfromtxt(StringIO(l))
        data.append(ar)
print(data)
data = np.array(data)
print(data)

但是,這是我要避免的:在 python 代碼中循環,因為讀取數據並將其轉換為numpy arrays需要超過四分鍾

In [401]: txt="""9 10 5 
     ...: 8 9 10 5 12 15 
     ...: 7 3 5 
     ...: 9 10 5 
     ...: 8 9 10 5 12 15 
     ...: 7 3 5 
     ...: 9 10 5 
     ...: 8 9 10 5 12 15 
     ...: 7 3 5""".splitlines()                                                                        

(這近似於我們使用readlines得到的結果)

收集列表列表很簡單,但是將字符串轉換為數字需要列表理解:

In [402]: alist = []                                                                                   
In [403]: for line in txt: 
     ...:     alist.append(line.split()) 
     ...:                                                                                              
In [404]: alist                                                                                        
Out[404]: 
[['9', '10', '5'],
 ['8', '9', '10', '5', '12', '15'],
 ['7', '3', '5'],
 ['9', '10', '5'],
 ['8', '9', '10', '5', '12', '15'],
 ['7', '3', '5'],
 ['9', '10', '5'],
 ['8', '9', '10', '5', '12', '15'],
 ['7', '3', '5']]
In [405]: np.array(alist)                                                                              
Out[405]: 
array([list(['9', '10', '5']), list(['8', '9', '10', '5', '12', '15']),
       list(['7', '3', '5']), list(['9', '10', '5']),
       list(['8', '9', '10', '5', '12', '15']), list(['7', '3', '5']),
       list(['9', '10', '5']), list(['8', '9', '10', '5', '12', '15']),
       list(['7', '3', '5'])], dtype=object)

將每一行轉換為 integer 數組可能會更快(但這只是一個猜測):

In [406]: alist = [] 
     ...: for line in txt: 
     ...:     alist.append(np.array(line.split(), dtype=int)) 
     ...:      
     ...:                                                                                              
In [407]: alist                                                                                        
Out[407]: 
[array([ 9, 10,  5]),
 array([ 8,  9, 10,  5, 12, 15]),
 array([7, 3, 5]),
 array([ 9, 10,  5]),
 array([ 8,  9, 10,  5, 12, 15]),
 array([7, 3, 5]),
 array([ 9, 10,  5]),
 array([ 8,  9, 10,  5, 12, 15]),
 array([7, 3, 5])]
In [408]: np.array(alist)                                                                              
Out[408]: 
array([array([ 9, 10,  5]), array([ 8,  9, 10,  5, 12, 15]),
       array([7, 3, 5]), array([ 9, 10,  5]),
       array([ 8,  9, 10,  5, 12, 15]), array([7, 3, 5]),
       array([ 9, 10,  5]), array([ 8,  9, 10,  5, 12, 15]),
       array([7, 3, 5])], dtype=object)

鑒於文本的不規則性質,以及結果中數組長度的混合,沒有太多的替代方案。 Arrays 或不同大小的列表是一個很好的指標,表明快速多維數組操作是不可能的。

我們可以將所有數字加載為一維數組:

In [413]: np.fromstring(' '.join(txt), sep=' ', dtype=int)                                             
Out[413]: 
array([ 9, 10,  5,  8,  9, 10,  5, 12, 15,  7,  3,  5,  9, 10,  5,  8,  9,
       10,  5, 12, 15,  7,  3,  5,  9, 10,  5,  8,  9, 10,  5, 12, 15,  7,
        3,  5])

但是將其拆分為 arrays 行仍然需要某種行數,然后是數組拆分。 所以我懷疑它是否會節省任何時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM