質問の内容は [0, 100] x [0, 100] の範囲を xy
方向にそれぞれ100分割して、10000個のセルを作成し、各点がどのセルに属するかを調べる問題であるため、これは2次元にヒストグラムを作成する際の過程と同じです。
scipy.stats.binned_statistic_2d を使って、2次元ヒストグラムを作成すれば、その結果として、各点がどのセルに属するかの情報も得られます。
python
1from collections import defaultdict
2from pprint import pprint
3
4import numpy as np
5from scipy import stats
6
7np.random.seed(0)
8points = np.random.uniform(0, 100, (100000, 3))
9
10x, y, z = points.T
11bin_x = np.arange(101) # x 方向のビンの端点
12bin_y = np.arange(101) # y 方向のビンの端点
13ret = stats.binned_statistic_2d(
14 x, y, x, "count", bins=[bin_x, bin_y], expand_binnumbers=True
15)
16
17# ビンのインデックスは1始まりなので、-1 して0始まりにする
18bin_xi, bin_yi = ret.binnumber - 1 # 各点が属するビンのインデックス一覧
19
20binned_points = defaultdict(list)
21for i, j, p in zip(bin_xi, bin_yi, points):
22 binned_points[(i, j)].append(p)
23
24# (1 <= x < 2) x (5 <= y < 6) の範囲の点一覧
25def get_points(xi, yi):
26 print(f"cell: [{bin_x[xi]}, {bin_x[xi + 1]}] x [{bin_y[yi]}, {bin_y[yi + 1]}]")
27 pprint(binned_points[xi, yi])
28
29
30get_points(1, 5)
cell: [1, 2] x [5, 6]
[array([ 1.88923157, 5.66266405, 30.85553737]),
array([ 1.41846832, 5.05993214, 58.74405306]),
array([ 1.56853325, 5.58620413, 75.45496865]),
array([ 1.66488745, 5.26065969, 38.08830329]),
array([ 1.36555089, 5.37167236, 70.72962468]),
array([ 1.34658834, 5.46705634, 59.60676644])]
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/14 11:16