2013-02-04 41 views
2

我使用numpy.genfromtxt導入數據,並且我想添加從數據集中的某些值派生的值的字段。由於這是一個結構化數組,因此向陣列中添加新列的最簡單有效的方法是使用numpy.lib.recfunctions.append_fields()。我發現這個庫的一個很好的描述HERE使用genfromtxt創建具有空列的numpy數組

有沒有辦法做到這一點,而不復制數組,也許迫使genfromtxt創建一個空列,我可以追加派生值?

+1

'genfromtxt'的第一個參數可以是一個生成器,在這個生成器中,您可以在讀取文件時在文件的每一行上創建一個空列。 – mtadd

+0

mtadd,我剛剛遇到了這個問題再次,我想知道你是否可以說明你在回答中提到的內容。謝謝! – ryanjdillon

回答

1

下面是一個使用生成器來使用字段添加到數據文件中一個簡單的例子genfromtxt

我們的示例數據文件會的data.txt與內容:

1,11,1.1 
2,22,2.2 
3,33,3.3 

所以

In [19]: np.genfromtxt('data.txt',delimiter=',') 
Out[19]: 
array([[ 1. , 11. , 1.1], 
     [ 2. , 22. , 2.2], 
     [ 3. , 33. , 3.3]]) 

如果我們做一個發電機,例如:

def genfield(): 
    for line in open('data.txt'): 
     yield '0,' + line 

其前添加一個逗號分隔的0到該文件中的每一行,然後:

In [22]: np.genfromtxt(genfield(),delimiter=',') 
Out[22]: 
array([[ 0. , 1. , 11. , 1.1], 
     [ 0. , 2. , 22. , 2.2], 
     [ 0. , 3. , 33. , 3.3]]) 

你可以通過以下解釋來做同樣的事情:

In [26]: np.genfromtxt(('0,'+line for line in open('data.txt')),delimiter=',') 
Out[26]: 
array([[ 0. , 1. , 11. , 1.1], 
     [ 0. , 2. , 22. , 2.2], 
     [ 0. , 3. , 33. , 3.3]]) 
+0

輝煌。如果只有'genfromtxt'可以爲分隔符提供一個正則表達式,它現在對我來說就是一個完美的工具。 – ryanjdillon

1

我試圖讓genfromtxt閱讀:

11,12,13,14,15 
21,22, 
31,32,33,34,35 
41,42,43,,45 

使用:

import numpy as np 
print np.genfromtxt('tmp.txt',delimiter=',',filling_values='0') 

,但沒有奏效。我不得不改變輸入加逗號代表空列:

11,12,13,14,15 
21,22,,, 
31,32,33,34,35 
41,42,43,,45 

那麼它的工作,返回:

[[ 11. 12. 13. 14. 15.] 
[ 21. 22. 0. 0. 0.] 
[ 31. 32. 33. 34. 35.] 
[ 41. 42. 43. 0. 45.]] 
+1

感謝Saullo。我實際上正在尋找的是另外一行,這在我正在閱讀的數據文件中不存在。 – ryanjdillon

+0

@shootingstars用於添加可以使用的其他行的數量np.vstack((a,np.zeros(( num_rows,a.shape [1]))))' –

+0

我的問題是,我將這個字段中的一個作爲'datetime'對象進行調用,這會阻止堆棧和numpy.lib.recfuntions'add_field'合併數組。 – ryanjdillon

相關問題