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

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

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

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

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

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

Q&A

解決済

1回答

1180閲覧

Numpyでfor loopを早くしたい。

kotai2001

総合スコア16

NumPy

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

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

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

0グッド

1クリップ

投稿2021/06/02 08:52

編集2021/06/02 09:11

Pythonは for文処理が遅く、numpyを利用して早くしたいと思います。

2枚の画像データ(img_kido_dx, img_kido_dy)と
照明の勾配データ(Rpg_grad_p, Rpg_grad_q)を利用し、
各画素の何らかの情報を持つ行列(2x2) Hを計算したいと思います。

アルゴリズム:下記の処理を各画素で行い、各画素に対応する(2x2) Hを求める
matE = [[E_x1,E_x2,...E_xn], [E_y1,E_y2,...E_yn]]
matR = [[R_p1,R_p2,...R_pn], [R_q1,R_q2,...R_qn]]
matM = inv(matR)
matH = matE x matM

普段の場合、下記のfor文で書きますが、やはり遅いです。(約30秒~)
これをnumpyで早くしたい場合、どうすればいいか教えていただけますでしょうか。

python

1 2import numpy as np 3 4N_ROW = 1080 5N_COL = 1920 6N_light = 20 7 8img_kido_dx = np.empty((N_ROW * N_COL, N_light)) 9img_kido_dy = np.empty((N_ROW * N_COL,N_light)) 10Rpg_grad_p = np.empty((N_ROW * N_COL,N_light)) 11Rpg_grad_q = np.empty((N_ROW * N_COL,N_light)) 12 13for i in range(N_ROW * N_COL): 14 15 mat_E = np.array([img_kido_dx[i, :], img_kido_dy[i, :]]) 16 mat_R = np.array([Rpq_grad_p[i, :], Rpq_grad_q[i, :]]) 17 18 mat_M = np.linalg.pinv(mat_R) 19 20 mat_H = np.matmul(mat_E, mat_M) 21 22

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

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

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

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

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

guest

回答1

0

ベストアンサー

  • データの配置を見直し
  • numbaで最適化(データ型の指定およびスレッド並列化)

で10倍弱くらいは高速化できました。

python

1import timeit 2import numba as nb 3import numpy as np 4 5N_ROW = 200 6N_COL = 400 7N_light = 20 8 9img_kido_dx = np.empty((N_ROW * N_COL, N_light)) + 0.1 10img_kido_dy = np.empty((N_ROW * N_COL,N_light)) + 0.1 11Rpg_grad_p = np.empty((N_ROW * N_COL,N_light)) + 0.1 12Rpg_grad_q = np.empty((N_ROW * N_COL,N_light)) + 0.1 13 14 15def f0(): 16 mat_H_all = np.empty((N_ROW * N_COL, 2, 2)) 17 for i in range(N_ROW * N_COL): 18 mat_E = np.array([img_kido_dx[i, :], img_kido_dy[i, :]]) 19 mat_R = np.array([Rpg_grad_p[i, :], Rpg_grad_q[i, :]]) 20 mat_M = np.linalg.pinv(mat_R) 21 mat_H_all[i] = np.matmul(mat_E, mat_M) 22 return mat_H_all 23 24 25@nb.jit("(f8[:,:,:], f8[:,:,:], f8[:,:,:])", 26 nopython=True, parallel=True, nogil=True) 27def _f1(mat_E_all, mat_R_all, mat_H_all): 28 for i in nb.prange(N_ROW * N_COL): 29 mat_E = mat_E_all[i] 30 mat_R = mat_R_all[i] 31 mat_M = np.linalg.pinv(mat_R) 32 mat_H_all[i] = np.dot(mat_E, mat_M) 33 34def f1(): 35 mat_E_all = np.stack([img_kido_dx, img_kido_dy], axis=1) 36 mat_R_all = np.stack([Rpg_grad_p, Rpg_grad_q], axis=1) 37 mat_H_all = np.empty((N_ROW * N_COL, 2, 2)) 38 _f1(mat_E_all, mat_R_all, mat_H_all) 39 return mat_H_all 40 41 42print(timeit.timeit(f0, number=1)) 43print(timeit.timeit(f1, number=1)) 44 45""" 468.433251421000023 470.9624153400000068 48"""

投稿2021/06/02 12:08

hayataka2049

総合スコア30935

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

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

kotai2001

2021/06/03 03:27

どうもありがとうございました。Numbaで、for文を残しても10倍ほど改善しますね。大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問