1

ですから、これは私の以前の質問に対するちょっとしたフォローアップの質問です:ポリゴン内の座標を生成し、私の答えhttps://stackoverflow.com/a/15243767/1740928 実際、ポリゴンデータを通常のグリッドにビニングしたいと思います。したがって、ポリゴン内のいくつかの座標を計算し、それらの緯度/経度の組み合わせをグリッドのそれぞれの列/行の組み合わせに変換します。

現在、行/列の情報は、データポリゴンの数に対応する行数と、ポリゴン内の座標に対応する列数を含むnumpy配列に格納されています。

コード全体の所要時間は1秒未満ですが、現時点でのボトルネックはこのコードです(約7秒)。

for ii in np.arange(len(data)):
    for cc in np.arange(data_lats.shape[1]):
        final_grid[        row[ii,cc], col[ii,cc] ] += data[ii]
        final_grid_counts[ row[ii,cc], col[ii,cc] ] += 1

配列「data」には、各ポリゴン(80000、)のデータ値が含まれているだけです。配列「row」と「col」には、ポリゴン内の座標の行番号と列番号が含まれています(形状:(80000,16))。ご覧のとおり、各グリッドセル内のすべてのデータ値を合計し、一致数をカウントしています。したがって、異なるポリゴンがグリッドセルと交差する場合の各グリッドセルの平均がわかります。それでも、これら2つのforループには約7秒かかるのでしょうか。もっと速い方法を考えられますか?

4

2 に答える 2

2

numpy は nd-bincount 関数を追加する必要があると思います。以前に取り組んでいたプロジェクトから転がっていました。

import numpy as np

def two_d_bincount(row, col, weights=None, shape=None):
    if shape is None:
        shape = (row.max() + 1, col.max() + 1)
    row = np.asarray(row, 'int')
    col = np.asarray(col, 'int')

    x = np.ravel_multi_index([row, col], shape)
    out = np.bincount(x, weights, minlength=np.prod(shape))
    return out.reshape(shape)

weights = np.column_stack([data] * row.shape[1])
final_grid = two_d_bincount(row.ravel(), col.ravel(), weights.ravel())
final_grid_counts = two_d_bincount(row.ravel(), col.ravel())

これが役立つことを願っています。

于 2013-03-06T21:48:50.360 に答える
1

さまざまなグリッドの形状を完全には理解していないかもしれませんが、次のccようなものを使用してループを削除することができます。

final_grid = np.empty((nrows,ncols))
for ii in xrange(len(data)):
    final_grid[row[ii,:],col[ii,:]] = data[ii]

もちろん、これはfinal_grid他の情報なしで開始していることを前提としています(増分しているカウントはゼロから開始します)。そして、あなたrowcolアレイがどのように機能するかを理解していないのに、それが機能するかどうかをテストする方法がわかりません。

于 2013-03-06T20:47:32.163 に答える