4

以下のプロットのように、いくつかの点を含むグリッドがあるとします。 デモ 私の目標は、グリッドのボックスごとにポイントを数えることです。そして、これは私の最初の試みです。

            for tupel in point_list:
               a=0
               b=0
               for i in self.boxvector:
                  if tupel[0] < i:
                     a=self.boxvector.index(i)-1
                     break

               for i in self.boxvector:
                  if tupel[1] < i:
                     b=self.boxvector.index(i)-1
                     break

               farray[a][b]+=1

動作しますが、遅いです。少しスピードアップすることはありますか?

という名前の変数を使用してboxvector、グリッドを定義します。この例では、boxvector は次のとおりboxvector = [-1., -.5, 0, .5, 1.]です。グリッドは常に最大値が -1 と 1 の 2 次です。ボックスは のfarrayように で表されますfarray = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]。そのため、アルゴリズムが対応するボックスでポイントを見つけるたびにインクリメントされる各ボックスに 1 つの値があります。point_list の形式はpoint_list = [(x0,y0),(x1,y1),(x3,y3), ...]

ご協力ありがとうございました !

4

3 に答える 3

7

すでにmatplotlibを使用しているように見えるので、を使用してnumpy.histogram2dください。

例として:

import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(0, 4*np.pi, 100)
x = np.cos(3 * t)
y = np.sin(t)

gridx = np.linspace(-1, 1, 5)
gridy = np.linspace(-1, 1, 5)

grid, _, _ = np.histogram2d(x, y, bins=[gridx, gridy])

plt.figure()
plt.plot(x, y, 'ro')
plt.grid(True)

plt.figure()
plt.pcolormesh(gridx, gridy, grid)
plt.plot(x, y, 'ro')
plt.colorbar()

plt.show()

ここに画像の説明を入力してください

ここに画像の説明を入力してください

于 2012-06-13T14:48:28.413 に答える
2

こちらもご覧ください

matplotlib.nxutils.pnpoly()

matplotlib.nxutils.points_inside_poly()

ポリゴン ユーティリティ内の非常に高速で効率的なポイント。グリッド コーナーの頂点に基づいてポリゴンを作成するだけで済みます。

http://matplotlib.sourceforge.net/api/nxutils_api.html

于 2012-06-13T14:53:10.070 に答える
1

位置を計算できます。0.5 (ボックス サイズ) で割ります。配列は 0 から始まりますが、座標は -1 から始まるため、分割する前に 1 ずつ調整します。エッジケースが 1 ( (1+1)/0.5 == 4) になるので、オーバーフローしないように注意してください 3.

次に例を示します。

>>> x,y = (0.8, -0.5)
>>> int((x + 1) / 0.5)
3
>>> int((y + 1) / 0.5)
1

3の最大結果を得るために考慮してください。

>>> f_pos = lambda pos: min(int((pos + 1) / 0.5), 3)
>>> f_pos(x)
3
>>> f_pos(y)
1

それで、それを完成させてください:

f_pos = lambda pos: min(int((pos + 1) / 0.5), 3)
for x,y in point_list:
    f_array[f_pos(x)][f_pos(y)] += 1
于 2012-06-13T14:39:24.923 に答える