1

テキストファイルから読み取った形式('x'、'y'、'value')のNx3データで極大値とカウントを見つけようとしています。「x」と「y」は等間隔のグリッドを形成し、「x」、「y」のすべての組み合わせに対して単一の値があり、次のようになります。

  3.0, -0.4, 56.94369888305664        
  3.0, -0.3, 56.97200012207031        
  3.0, -0.2, 56.77149963378906        
  3.0, -0.1, 56.41230010986328        
  3.0,  0,   55.8302001953125       
  3.0,  0.1, 55.81560134887695        
  3.0,  0.2, 55.600399017333984        
  3.0,  0.3, 55.51969909667969        
  3.0,  0.4, 55.18550109863281         
  3.2, -0.4, 56.26380157470703 
  3.2, -0.3, 56.228599548339844
  ...

問題は、私が使用しようとしている画像コード(リンク)では、画像処理のためにデータが異なる2Dマトリックス形式である必要があることです。これは、コードの関連部分です。

# Construct some test data
x, y = np.ogrid[-np.pi:np.pi:100j, -np.pi:np.pi:100j]
r = np.sin(np.exp((np.sin(x)**3 + np.cos(y)**2)))

# Find contours at a constant value of 0.8
contours = measure.find_contours(r, 0.8)

誰かが私のデータを必要な「グリッド」形式に変換するのを手伝ってもらえますか?

編集:私はついにパンダに行きましたが、一般的なケースでは選択された答えの方が良いと思います。これは私がしたことです:

from pandas import read_csv
data=read_csv(filename, names=['x','y','values']).pivot(index='x', columns='y',
              values='values')

この後data.values、私が望んでいたように、テーブルを2Dの「画像形式」で保持します。

y   -0.4        -0.3        -0.2        -0.1
x               
3.0  86.9423     87.6398     87.5256     89.5779
3.2  76.9414     77.7743     78.8633     76.8955
3.4  71.4146     72.8257     71.7210     71.5232
4

2 に答える 2

2

最善の解決策は、あなたが与えていない詳細に本当に依存します. ところで、実際にコードを指定するか、少なくとも np.loadtxt 命令を指定する必要あります。以下で、「データ」は、以下を使用してファイルからロードされた配列です。

data = np.loadtxt('file.txt', [('x',float), ('y',float), ('value',float)])

1) 直接変形:

@ tom10が言ったことに続いて
、(x、y、value)データが特定の順序で保存されていることがわかっている場合:

[(x0,y0,v00), (x0,y1,v01), .... , (x1,y0,v10),(x1,y1,v11), ... ,(xN,yM,vNM)]

そして、すべての (x,y) ペアの値が与えられていること。次に、値のリストから 1D numpy 配列を作成し、それを再形成するのが最善です。

x = np.unique(data['x'])
y = np.unique(data['y'])
r = data['value'].reshape((x.size,y.size))

2) 一般的なケース:

Python (numpy) で配列を作成するを参照してください。同様の質問と辞書を使用した他の解決策について

(x,y,value) タプルを持つこと以外に何も保証できない場合:

# indexing: list of x and y coordinates, and functions that map them to index
x  = np.unique(data['x']).tolist()
y  = np.unique(data['y']).tolist()
ix = np.vectorize(lambda i: x.index(i), otypes='i')
iy = np.vectorize(lambda j: y.index(j), otypes='i')

# create output array
r  = np.zeros((x.size,y.size), float)   # default value is 0
r[ix(data['x']), iy(data['y'])] = data['value']

注:上記のリファレンスでは、辞書を使用した別のアプローチが示されています。これは読みやすいと思いますが、相対速度はテストしていません。

3) 中間ケース?

特定の順序で指定された通常のグリッド座標とまったく制約がない中間のケースがあるかもしれません。一般的なケースでは非常に遅くなる可能性があるため、データが従うすべての規則を利用するようにアルゴリズムを設計する必要があります。

1 つの例は、xy インデックス付けが特定の規則に従っていることがわかっているが、必ずしも順番に指定されているとは限らない場合です。たとえば、x と y が次の形式の等間隔の「グリッド」座標であることがわかっている場合:

coordinate = min_coordinate + i*step

次に、min_coordinatestep (x と y の両方) を見つけ、この方程式を解いてiを見つけます。このようにして、コストのかかるインデックス マッピングnp.vectorized(... list.index(...))を回避します。

x  = np.unique(data['x'])
y  = np.unique(data['y'])
ix = (data['x']-x.min())/(x[1]-x[0])
iy = (data['y']-y.min())/(y[1]-y[0])

# create output array
r  = np.ones((x.size,y.size), float)*np.nan   # default value is NaN
r[ix.astype(int), iy.astype(int)] = data['value']
于 2012-05-02T12:45:53.757 に答える
1

使用しているプログラムの場合、データはz値の長方形配列である必要があります(この例では、xとyを使用してzを構成しますが、二度と使用することはありません)。9 x Nの配列があるようです(Nは表示されないものです)。これを取得する簡単な方法の1つは、データをz値のフラットなコレクションとして読み込み、x、y値をスキップして、希望reshapeの形状を設定することです。(十分な情報が提供されていないため、このコードを実際に作成することはできませんが、難しいことではありません。)

于 2012-05-01T20:49:32.973 に答える