2012-02-02 3 views
2

私はプロットが必要な非常に大量のデータを持っていますが、これは3列にxyzデータとして格納されています。列データをグリッドに変換する必要がありますので、matplotlibでcontourfで簡単にプロットすることができます。自分で作成したコードが非常に遅いため、これを行う関数があるかどうか疑問に思っていましたか?このようなグリッドに、すなわち列xyzデータをグリッドにプロットする

x y z 

1 1 10 

1 2 12 

2 1 14 

2 2 16 

10 12 

14 16 

答えて

2

numpyのは、一種のスマートこれです。あなただけの別々の配列に列を読み込んで行うことができます:

import numpy 

idx1 = numpy.array([0, 0, 1, 1]) 
idx2 = numpy.array([0, 1, 0, 1]) 
data = numpy.array([10, 12, 14, 16]) 

grid = numpy.zeros(len(data)/2, 2) 
grid[idx1, idx2] = data 

>>>grid 
array([[ 10., 12.], 
     [ 14., 16.]]) 

あなたは、あなたが各要素から1をデクリメントする必要が1から始まる場合、インデックスがそう0から始まることに注意してください。

+0

を役に立てば幸い最初の2つの列に連続した整数が含まれていないか、整数が全く含まれていない場合はどうなりますか? – balu

+0

答えを見つけた:https://stackoverflow.com/a/15120881/36253 – balu

0

データがdata.txtに含まれているとします。次のコードは、データの必要な部分を正しい順序で印刷します。ファイルの全てのコンテンツが処理された(ただし、すべての値がまだ印刷される場合、これは例外で終了すること

data.txt 
x y z 
1 1 10 
1 2 12 
2 1 14 
2 2 16 

def extract(filepath): 
    f = open(filepath) 
    f.readline() # to read out the first line that says "x y z" 
    while 1: 
     x = f.readline().strip().split()[-1] 
     y = f.readline().strip().split()[-1] 
     print x, y 

data.txtが連続線でxy座標を有すると仮定すると

)。これを避けるため、data.txtは、そのような構造されていない場合は、その後、あなたは各行の最初の2つの数字を活用するために必要with open(filepath) as f:

f = open(filepath)を交換するには:

data.txt 
x y z 
1 1 10 
2 1 14 
1 2 12 
2 2 16 

from collections import defaultdict 
def extract(filepath): 
    coords = defaultdict(dict) 
    f = open(filepath) 
    f.readline() # to read out the first line that says "x y z" 
    for line in f: 
     id, axis, val = map(int, line.strip().split()) 
     coords[id][axis] = val 

    for i in sorted(coords): 
     print coords[i][1], coords[i][2] 

が、これは

関連する問題