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

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

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

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

Python 3.x

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

Q&A

解決済

1回答

1152閲覧

Numpyで最大値の隣の要素を取り出す

taka_jp

総合スコア22

NumPy

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

Python 3.x

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

0グッド

0クリップ

投稿2019/02/08 13:05

numpyの練習として,画像をrgbからhsvへ変換するコードを書いていました.
rgbですので画像のはshapeは,高さh,幅wとすると,hw3です.
rgbからhsvへ変換する際にhを求める式では,
最大値が
rの場合 g-b
gの場合 b-r
bの場合 r-g
とそれぞれ最大値以外の値を用いた計算が必要となります.(参考url
numpyの操作として最大値を取り出すのは造作もないのですが,最大値の右隣や左隣の要素を取り出すのが難しいです.
取り出すべき値のindexについては,argmaxを用いて得られるために得たindexに+1もしくは+2をした後に%3と余りを求めれば隣の要素のindexも得られるために,内包表記を用いてTrue Falseで位置を示す配列を作成することは出来ました.
しかしそれはスマートではありません.
何か良い方法はないでしょうか.

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

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

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

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

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

tiitoi

2019/02/08 15:52

(h*w*3) という1次元配列でなく、(H, W, 3) という3次元配列として扱えばよいのではないでしょうか?
hayataka2049

2019/02/08 16:09

ん、shape=(h*w*3,)なんですかね。勝手に(H, W, 3) だと思ってたけど。
guest

回答1

0

ベストアンサー

とりあえずこうなる。

python

1>>> import numpy as np 2>>> a = np.array([[[0,1,2],[3,5,4]],[[8,6,7],[9,11,10]]]) 3>>> a 4array([[[ 0, 1, 2], 5 [ 3, 5, 4]], 6 7 [[ 8, 6, 7], 8 [ 9, 11, 10]]]) 9>>> argmax = a.argmax(axis=2) 10>>> argmax 11array([[2, 1], 12 [0, 1]]) 13>>> idx1 = (argmax+1)%3 14>>> idx2 = (argmax+2)%3 15>>> idx1 16array([[0, 2], 17 [1, 2]]) 18>>> idx2 19array([[1, 0], 20 [2, 0]])

ここから先ですが、私はこの間こんな回答をしたので、この考え方に基づいてやることにします。

Python - Numpy 3Darrayのインデックスを2Darrayで指定したい(再度)|teratail

python

1>>> (np.take_along_axis(a, idx1.reshape(idx1.shape+(1,)), axis=2) - np.take_along_axis(a, idx2.reshape(idx2.shape+(1,)), axis=2)).reshape(idx1.shape) 2array([[-1, 1], 3 [-1, 1]])

少し改良するとこう。

python

1>>> tmp = np.take_along_axis(a, np.stack([idx1, idx2], axis=2), axis=2) 2>>> tmp[:,:,0] - tmp[:,:,1] 3array([[-1, 1], 4 [-1, 1]]) 5

投稿2019/02/08 16:02

hayataka2049

総合スコア30933

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

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

taka_jp

2019/02/09 12:08

なるほど,インデックスを2次元配列で指定するといった考えはありませんでした. 大変勉強になりました.ありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問