質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2153閲覧

xyz空間において, xy平面をグリッドで区切り, 各セルのz軸方向に存在する点を求める

hikaru397

総合スコア6

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/06/14 10:22

xyz空間において, xy平面をグリッドで区切り, 各セルのz軸方向に存在する点を求めたいです.
存在する点のx,y,z座標の型は小数です.

xyz空間に存在する点の座標(x,y,z)は保持しています.
具体的には以下の形で保持しています.
coordinate:
[[4.1 4.7 4.9]
[0.1 2.5 2.1]
[4.5 6.2 4.3]
...
[0.4 0.8 0.7]
[2.2 6.3 0.1]]
coordinate.shape: (N, 3)
type(coordinate): <class 'numpy.ndarray'>

例えば, セルの大きさが 1m * 1m の場合、
0<=x<=100, 0<=y<=100とすると, セルは100*100個生成されます.
この各セルのz軸方向に存在する点を求めたいです.

Numpy利用して上手く実装する方法はありますでしょうか?
多重のforループを使う方法を考えましたが, 実行速度が気になりました.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

質問の内容は [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:08

編集2020/06/14 11:16
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hikaru397

2020/06/14 11:16

考え方までご教授いただきありがとうございます。 非常に勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問