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

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

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

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

3810閲覧

pythonで部分配列の平均値を高速で計算する方法

tak__tak

総合スコア78

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2016/10/31 01:40

編集2016/10/31 09:08

pythonで実数値配列から部分配列(スライス)を得てその平均値を計算するということを出来るだけ高速に実行したいのですが、
それを効率的に実行する方法にはどんなことがあるでしょうか?

例えば画像画素値の配列から、縮小画像の配列を得るような計算をしたいのです。

python

1 for i in range(size): 2 for z1 in range( count ): 3 for x1 in range( count ): 4 for y1 in range( count ): 5 avg[ i ][ z1 ][ y1 ][ x1 ] = np.average( data[ i , z1 , x1*width:(x1*width +width) , y1*width:( y1*width +width) ] )

今はこのようにしていますが
もっと良いコードがあると思っています。

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

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

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

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

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

ozwk

2016/10/31 01:54

今何を使ってどの程度でどのぐらい早くしたいんでしょうか
ikedas

2016/10/31 04:06

画像処理が目的なら、Pillow https://pillow.readthedocs.io/ のようなモジュールを使えば画像フォーマット変換なども含めて面倒みてくれるので早いです。実現したいことをもうちょっと具体的に教えてもらえますか。
tak__tak

2016/10/31 08:58 編集

処理自体は縮小画像を得るような処理を何百万回も実行したいのですが、 配列は一回ごとに新しく得られるため、事前に縮小画像を作っておくという方法では役に立ちませ
ikedas

2016/10/31 09:34

ソースコードを示して戴きましたが、ソースコードは実際に動作するもの (かつ、質問と関係ない処理はなるべく省いたもの) を提示して下さい。
guest

回答2

0

ベストアンサー

NumPyを使っているということは理解しました (拡張モジュール含め、使っているソフトウェアやそのバージョンは明記して下さい)。回答します。

提示されたソースコードを見る限りでは、処理をより速くする方法を思いつきませんでした。理由は、平均値の計算の対象となる各々のブロックが独立しており、隣り合うブロックの計算結果を利用するような技巧を凝らす余地がないからです。処理の性能は、average()の計算速度だけでほぼ決まってしまいます。

逆に言えば、隣り合うピクセルやブロック同士で計算結果を利用するような処理なら、高速化の余地があるということです。例を挙げると、ノイズ除去のためにピクセル値の移動平均を取るような処理です (この例の場合、畳み込み積分として計算することで高速化できます)。

投稿2016/10/31 12:26

ikedas

総合スコア4354

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

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

0

速くする部分として、部分配列の生成、部分配列内の平均値の集計と少なくとも2箇所の処理があると思いますが、そのどちらもを速くする必要がありますか?
また、大本の配列自体の生成やメモリーへのロードがネックになっているかもしれません。
現時点でそれぞれの処理にどのくらい時間が掛かっており、それをどのくらいの速さまで持って行きたいと思っていらっしゃいますか?

投稿2016/10/31 02:27

kenics

総合スコア179

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

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

tak__tak

2016/10/31 09:01

生成、集計のどちらも速くする必要があるのではないかと思っているのですが、 どちらかの変更によって処理コストがかかっても、もう一方でそれ以上に高速化が図れるならそれで良いと思っています。
tak__tak

2016/10/31 09:02

元配列やメモリーへのアクセスなどは十分に最適化されているのではないかと思いますが 時間は計算します
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問