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

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

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

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

Python 3.x

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

Python

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

Q&A

解決済

1回答

2011閲覧

xyz空間において, ある座標(x,y)の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/05/18 02:52

編集2020/05/18 02:55

xyz空間において, ある座標(x,y)のz軸方向に存在する点を求めたいです.
存在する点は, 全て格子点上に位置するので, x,y,zは整数です.

xyz空間に存在する点の座標(x,y,z)は保持しています.
具体的には以下の形で保持しています.
coordinate:
[[4 4 4]
[0 2 2]
[4 6 4]
...
[0 0 0]
[2 6 0]]
coordinate.shape: (N, 3)
type(coordinate): <class 'numpy.ndarray'>

例えば, 入力として(x, y)=(1,2)を与えると,
出力として(1,2,0), (1,2,1) (1,2,6), (1,2,10)が得られるイメージです.
これを全ての座標(x, y) 例えば(0<=x<=100, 0<=y<=100)について行いたいです.

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

coordinate の1列目が x かつ coordinate の2列目が y かどうかという bool 配列を作成し、bool indexing で取得すればよいと思います。

python

1import numpy as np 2 3np.random.seed(0) 4 5points = np.random.randint(0, 3, (20, 3)) 6print(points) 7# [[0 1 0] 8# [1 1 2] 9# [0 2 0] 10# [0 0 2] 11# [1 2 2] 12# [0 1 1] 13# [1 1 0] 14# [1 0 0] 15# [1 2 0] 16# [2 0 1] 17# [1 2 0] 18# [1 1 1] 19# [0 2 0] 20# [2 2 0] 21# [2 0 0] 22# [0 1 1] 23# [2 0 0] 24# [1 0 1] 25# [2 2 0] 26# [1 1 1]] 27 28xy = (1, 2) # xy 座標 29 30 31print(points[(points[:, 0] == xy[0]) & (points[:, 1] == xy[1])]) 32# [[1 2 2] 33# [1 2 0] 34# [1 2 0]]

追記

for で回すのでもいいと思いますが、一応、別解も書いておきます。

  1. numpy.lexsort で点一覧を xyz 順にソートする。
  2. x_pos = np.nonzero(np.diff(points[:, 0]))[0] + 1 で x 座標が変わるインデックスを調べる。
  3. y_pos = np.nonzero(np.diff(points[:, 1]))[0] + 1 で y 座標が変わるインデックスを調べる。
  4. np.unique(np.concatenate([x_pos, y_pos])) で x または y 座標が変わるインデックスを取得する。
  5. x または y 座標が変わるインデックスの位置で点一覧を分割する。

python

1import numpy as np 2 3np.random.seed(0) 4 5points = np.random.randint(0, 10, (20, 3)) 6print(points) 7xy = (1, 2) # xy 座標 8 9# xyz 順でソートする。 10ind = np.lexsort((points[:, 2], points[:, 1], points[:, 0])) 11points = points[ind] 12print(points) 13 14# xy の値が変わるインデックスを調べる。 15x_pos = np.nonzero(np.diff(points[:, 0]))[0] + 1 16y_pos = np.nonzero(np.diff(points[:, 1]))[0] + 1 17xy_pos = np.unique(np.concatenate([x_pos, y_pos])) 18 19# xy の値が変わるインデックスで分割する。 20split_points = np.split(points, xy_pos) 21 22for group in split_points: 23 print(f"x={group[0, 0]}, y={group[0, 1]}") 24 print(group)

投稿2020/05/18 03:00

編集2020/05/18 06:01
tiitoi

総合スコア21956

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

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

hikaru397

2020/05/18 03:20 編集

回答ありがとうございます。 非常に勉強になります。 これを全ての座標(x, y) 例えば(0<=x<=100, 0<=y<=100)について行いたい場合, 回答頂いたコードの場合(0<=x<=2, 0<=y<=2)についてですが、 ``` for x in range(3): for y in range(3): print(x, y) print(points[(points[:, 0] == x) & (points[:, 1] == y)]) ``` このようにforループを2回回せばよいでしょうか? それとも実行速度からして他の方法を取った方がよろしいでしょうか?
tiitoi

2020/05/18 03:44

for で回すでもいいと思いますよ。 一応 numpy の機能を使った別解も書いておきました。
hikaru397

2020/05/18 05:53 編集

ありがとうございます!大変参考になります! 上記の別解についてですが、手元の環境で動かすと (x_pos,) = np.nonzero(np.diff(points[:, 0])) + 1 TypeError: can only concatenate tuple (not "int") to tuple このようなエラーが出ましたので、以下のようにコードを修正しました。 # xy の値が変わるインデックスを調べる。 x_pos = np.nonzero(np.diff(points[:, 0]))[0] + 1 y_pos = np.nonzero(np.diff(points[:, 1]))[0] + 1 xy_pos = np.unique(np.concatenate((x_pos, y_pos)))
tiitoi

2020/05/18 05:58

すいません。 こちらのミスです。回答を修正しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問