1

numpy、特に histrogram2d 関数を使用しています。ポイントの 3D 空間分布 (配列xyおよびz) を 2D ヒストグラムでビニングしています。各ポイントには、関連付けられた密度フィールドがありますd

私がそのようなことをしたら

import numpy as np
H, xedges, yedges = np.histogram2d(x,y,bins=200,weights=d)

ヒストグラムHは、視線方向 (この場合は z 軸) に沿った密度の合計を表します。非常に大きな配列で作業していることを考えると、これは非常に高速で簡単です。

さらに進んで、視線に沿ってフィールドされた密度の合計をプロットする代わりに、各 2D ビンの密度の最大値を取得したいと考えています。可能な解決策をコーディングしました:

from numpy import *
x=array([0.5,0.5,0.2,0.3,0.2,0.25,0.35,0.6,0.1,0.22,0.7,0.45,0.57,0.65])
y=array([0.5,0.5,0.28,0.18,0.85,0.9,0.44,0.7,0.1,0.22,0.7,0.45,0.54,0.65])
d=array([1,1,2,2,3,5,6,8,7,9,6,10,5,7])

bins=linspace(0,1,64)

idx=digitize(x,bins) 
idy=digitize(y,bins) 

img2=zeros((len(bins),len(bins)))

for i in arange(0,len(d)):
  dummy=idx[i]
  dummy2=idy[i]
  img2[dummy][dummy2]=max(d[i],img2[dummy][dummy2])

ただし、最後の行のループは、巨大なデータセットでは非常に遅くなる可能性があります。どうすればより速くできるかについてのアイデアはありますか?

4

1 に答える 1

0

申し訳ありませんが、今はコードを書く時間がありません:

  1. numpy.ravel_multi_index2 次元の問題を 1 次元の問題に変換するために使用します。
  2. の実装を見てください。numpy.unique一意のビン値を取得するためにそのようなことをしたいのですがd、同時に の最小/最大も得られるようにしたいと考えています。numpy.lexsortここでも役立つかもしれません。
  3. 2 次元空間に戻るには、次のように簡単にする必要があります。img2.flat[uniq_1d_bin_value] = bin_max

始めるにはこれで十分だと思います。問題が発生した場合は、コードを投稿して、行き詰まった場所をお知らせください。私または他の誰かが、正しい道に戻るのを手伝ってくれるかもしれません.

于 2012-08-09T17:34:21.787 に答える