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

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

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

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

Python 3.x

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

Q&A

解決済

2回答

1357閲覧

numpyの配列の操作のやり方について

babbleman

総合スコア107

NumPy

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

Python 3.x

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

0グッド

0クリップ

投稿2021/08/12 14:45

numpyを使って3次元配列の3次元目にのみ特別な計算を施した結果を得るにはどうしたら良いでしょうか?

例えば(100,200,3)という形の配列があったとして、
,3の部分、例えば[3,4,5]という要素だとしてそれの平均4を取ったものに置き換え、(100,200)に変換をしたいです。
for文を使わずこれを書くにはどうしたらよいでしょうか?
ちなみに上の例は画像をグレースケールに変換したい場合などです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

  • 例えば[3,4,5]という要素だとしてそれの平均4を取ったものに置き換え、(100,200)に変換をしたいです。

という質問と、

  • 画像をグレースケールに変換したい場合などです。

という質問で答えが違います。

前者の質問の答えは37458さんが書かれている通りです。

しかし、shapeが(100,200,3)でdtypeがuint8のカラー画像にその処理を行うと、shapeが(100,200)ででdtypeがfloat64のndarrayとなり、正しいグレースケール画像にはなりません。

この場合は、np.mean(array,axis=2).astype('uint8') とすべきです。
普通は、cv2.cvtColor(array, cv2.COLOR_BGR2GRAY)でやるでしょう。

Python, OpenCV, NumPyでカラー画像を白黒(グレースケール)に変換 をご覧ください。

  • 平均など一般的なものではなく独自の関数を設定したい場合にはどうしたらよいのでしょうか?

これを最初から書いて置いた方が、回答は速く得られますよ。
回答者からは、初心者なのか、ある程度分かっている人が聞いているのかは分からないのです。

回答は以下です。

python

1def f(x): 2 return sum(x)//len(x) 3 4np.apply_along_axis(f, 2, array)

lambda式を使えば、以下でも同じです。

python

1np.apply_along_axis(lambda x: sum(x)//len(x), 2, array)

投稿2021/08/12 22:27

編集2021/08/13 01:19
ppaul

総合スコア24666

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

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

babbleman

2021/08/13 00:52

回答していただき有難うございます。 昨日質問の投稿後、愚直にfor文を回して書いてみたのですが型が合わないというエラーが出ていたのでnp.floatなどで試してましたがうまくいかなかったです。 グレースケールはそのまま既存の関数を使えば大丈夫なのですが、どちらかというとこれからやりたいことは輪郭抽出で、微分フィルタというものにかけるときにブロードキャスト的な計算ができるようにしておきたいと考えました。
babbleman

2021/08/13 04:07

ありがとうございます! まさにピンポイントで教えて頂きました。 読み返してみて質問が回りくどかったので、今度からよりピンポイントな質問をするようにします。
guest

0

np.mean(array,axis=2)

axisが圧縮したい次元です。
numpyの関数には次元を指定する引数がついていることが多いです。

投稿2021/08/12 14:57

37458

総合スコア70

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

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

babbleman

2021/08/13 00:19

回答していただき有難うございます。 axisはそのような場合のためにあったのですね。 平均など一般的なものではなく独自の関数を設定したい場合にはどうしたらよいのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問