2016-10-20 9 views
0

以下のデータを3D配列に取得するのには苦労しています。ちょっとした助けに感謝します。下の概要があなたがすることであれば、それを自由に変更してください。以下データから3D配列を生成

with open("data.txt","r") as f: 
    info = [] 
    for line in f: 
     if line[0] == "#": 
      continue 
     freq, delay, reading = line.split(',') 

     if not info: 
      # Enter first entry into info 
     else: 
      # Insert freq, delay and reading into 3D array 

    # Print data.txt in something like the format at the end of question 
    # (not necessarily in order) 
    for freq in info: 
     print freq[0] 
     for delay in freq: 
      print "\t%d" % delay[0] 
      for reading in delay: 
       print "\t\t%f" % reading 

概略以下の出力を所望の

#freq,delay,reading 
291,1000,-29.22 
320,1000,-29.33 
270,2000,-29.11 
240,1500,-29.04 
220,1000,-28.89 
272,1000,-29.11 
291,1500,-29.21 
320,1000,-29.34 
270,2000,-29.1 
240,1000,-29.02 
220,1500,-28.89 
272,1500,-29.12 
291,1000,-29.19 
320,1000,-29.32 
270,2000,-29.1 
240,1000,-29.02 
220,1000,-28.88 
272,1000,-29.1 

data.txtをサンプルです。

220 
    1000 
     -28.89 
     -28.88 
    1500  
     -28.89 
240  
    1000  
     -29.02 
     -29.02 
    1500  
     -29.04 
270  
    2000  
     -29.11 
     -29.1 
     -29.1 
272  
    1000  
     -29.11 
     -29.1 
    1500  
     -29.12 
291  
    1000  
     -29.22 
     -29.19 
    1500  
     -29.21 
320  
    1000  
     -29.34 
     -29.33 
     -29.32 

答えて

1

テキストファイルのサイズがわかりません。しかし、それを行う最も簡単な方法は、それらを分割する前に線を並べることです。しかし、それはそれらをメモリに読み込む必要があります(または、メモリが不足していると新しいファイルを作成する可能性は低いです)。

lines = [] 
with open("data.txt") as file: 
    for line in file: 
     lines.append(line) 
sorted_lines = sorted(lines) 

last_freq = None 
last_delay = None 

for line in sorted_lines: 
    freq, delay, reading = line.strip('\n').split(',') 
    if last_freq_column != freq: 
     print freq, 
    last_freq = freq 
    if last_delay_column != delay: 
     print delay, 
    last_delay = delay 
    print reading 

私はそれをテストしていないので、擬似コードを検討してください。それらは誤植かもしれません。しかし、あなたはそのアイデアを得るでしょう。

あなたの出力は実際には3D配列ではありません。しかし、リストのリストを生成する場合(Pythonで行う必要があるため)、コードを簡単に変更できます。

1

ない非常に何をしたいが、簡潔:

import numpy as np 

data = np.loadtxt("data.txt", delimiter=",") 
dsort = data[np.lexsort(data.T[::-1])] 

print dsort 

利回り:

[[ 220. 1000.  -28.89] 
[ 220. 1000.  -28.88] 
[ 220. 1500.  -28.89] 
[ 240. 1000.  -29.02] 
[ 240. 1000.  -29.02] 
[ 240. 1500.  -29.04] 
[ 270. 2000.  -29.11] 
[ 270. 2000.  -29.1 ] 
[ 270. 2000.  -29.1 ] 
[ 272. 1000.  -29.11] 
[ 272. 1000.  -29.1 ] 
[ 272. 1500.  -29.12] 
[ 291. 1000.  -29.22] 
[ 291. 1000.  -29.19] 
[ 291. 1500.  -29.21] 
[ 320. 1000.  -29.34] 
[ 320. 1000.  -29.33] 
[ 320. 1000.  -29.32]] 
関連する問題