2016-04-03 61 views
3

循環需要一些幫助Python代碼和一些數組:雖然與某些陣列條件

我有一個txt文件,看起來像這樣:

1 1 6 
1 2 65 
1 3 23 
2.3 2 43 
2.3 4 23 
3.1 4 45 
3.1 6 35 
3.1 7 15 
5 3 67 
5 9 45 

E.G. 3列的數據和任意數量的行

我想要做的是對列的所有相同的第一個條目的每列的一些操作。

因此,對於上面的例子:腳本看起來和看到有3行,第一列是1 - 然後它對這3行做一些操作 - 可以說第三列和第二列。然後,它在陣列中存儲這些值 - 因此目前這個陣列將具有值:

store_values = [5,63,20]

然後查找在第一列中的下一個相同的值:它看到有兩個2.3。然後它執行相同的操作(以列3和2之間的差)和追加store_value陣列,所以現在:

store_values = [5,63,20,41,19]

然後,它再次搜索:看到兩個3.1 - 做同樣的事情,並繼續這樣做,直到它貫穿所有相同的值。 txt被排序 - 因爲我認爲這將更容易處理。

最終store_values = [5,63,20,41,19,41,29,8,64,36]

現在我使用了非常基本的例子與所述的差別,因爲我知道我可以得到上面的數組只是考慮了差異而不是擔心第一列 - 但是我的腳本正在做一些更復雜的事情,它必須依賴於第一列 - 例如將第3列和第2列繪製爲相同的第一個條目,線性擬合,並將斜率存儲在陣列中。

至今:

import numpy as np 

data_file_name = 'whatever.dat' 

data=np.loadtxt(data_file_name) 

希望這是有道理的 - 如果我需要澄清的東西,請評論

+0

我要提到我有25,000行的數據 - 所以內存是一個問題。 – Scientized

+0

你並沒有真正的內存問題。 25,000行乘3列乘8個字節,每個浮點數爲600kB。您的機器擁有1,000-10,000倍的內存。 – Dunes

回答

2

您可以同時使用uniquewhere從numpy的解決你的問題。下面的代碼:

import numpy as np 

data_file_name = 'in.txt' 

data=np.loadtxt(data_file_name) 

unique = np.unique(data[:,0]) 
out = [] 
for i in unique: 
    ind = np.where(data[:,0]==i) 
    out.append(data[ind,2]-data[ind,1]) 
outarray = np.hstack(out)[0] 

print(outarray) 

,結果是:

[ 5. 63. 20. 41. 19. 41. 29. 8. 64. 36.] 

使用unique功能,您不需要有整理出來的元素。根據您可能具有的其他標準(例如使用列表使用的內存超過所需內存),還有其他幾種解決此問題的方法,但如果您的數據不太過分,則此解決方案是清晰且功能強大的。

+0

是的我應該提到我有25,000行數據 - 所以內存是一個問題。我會嘗試這種方法,看看需要多長時間 – Scientized

+1

@renegade內存支出是一回事,性能(速度)是另一回事。雖然可能,但通常來說,兩者都很困難,因爲速度更快,您需要更快速地訪問內容,而將內容放入內存中。無論如何,25000行並不多,解決方案應該可以正常工作。 – armatita

0

我相信問題很簡單,您可能會過度解決問題。我會根據我對你問的內容的理解來回答。

  1. 你可以在每行1一次讀:currentline = next(data)
  2. 在空間分割:info = currentline.split()
  3. 操縱,但是你想

NB的價值觀 - '信息' 變量存儲該數據作爲一個列表。在你的情況,對於線#1 info = ['1', '1', '6']

希望這會有所幫助!

2

您可以使用pandas來做到這一點,這比分組用numpy更通用。

  1. 閱讀數據幀中的數據,

與read_table:

In [5]: df=read_table('so.txt',header=None,sep='\s+')  
""" 
    0 1 2 
0 1.0 1 6 
1 1.0 2 65 
2 1.0 3 23 
3 2.3 2 43 
4 2.3 4 23 
5 3.1 4 45 
6 3.1 6 35 
7 3.1 7 15 
8 5.0 3 67 
9 5.0 9 45 
""" 
  • 通過柱0組數據,
  • 和在數組中組織第1列和第2列。

    In [6]: groups=df.groupby(0)[[1,2]].apply(array) 
    """ 
    0 
    1.0  [[1, 6], [2, 65], [3, 23]] 
    2.3    [[2, 43], [4, 23]] 
    3.1 [[4, 45], [6, 35], [7, 15]] 
    5.0    [[3, 67], [9, 45]] 
    
    """ 
    
    1. 然後根據需要使用。

    繪製例如:

    In [7]: for label,points in groups.iteritems(): plot(*points.T,label=label);legend() 
    

    enter image description here