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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

Q&A

解決済

1回答

384閲覧

完成したコードによる解析時間を短縮したい

fractal2310

総合スコア1

Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

0グッド

0クリップ

投稿2022/08/01 08:31

前提

Windows10
Visual Studio Code

Pythonでボックスカウント法によるフラクタル次元解析を行っています。
コードは完成しているのですが、解析時間が長くなってしまいます。

実現したいこと

解析時間を短縮したいです。
可能であればコードの簡略化もしたいです。

該当のソースコード

import pandas as pd import cv2 import numpy as np FILEPATH ='C:/python_workspace/dummy/dummy.csv' #csvデータのあるディレクトリ df = pd.read_csv(FILEPATH,index_col=None,header=None) #1×1 boxsize = 1 #ボックスサイズの指定 size = boxsize + 1 #区切るサイズ col1 = 0 #ボックスの最初の列 col2 = size #ボックスの最後の列 row1 = 0 #ボックスの最初の行 row2 = size #ボックスの最後の行 Max =[] #ボックスごとの最大値 Min =[] #ボックスごとの最小値 for num in range(128): #分割するボックスの個数を指定 col1 =0 col2 = size for div_col in range(128): block = df.iloc[row1:row2, col1:col2] max = np.max(np.max(block)) min = np.min(np.min(block)) Max.append(max) Min.append(min) col1 = col1 + boxsize col2 = col2 + boxsize row1 = row1 + boxsize row2 = row2 + boxsize boxcount1 = (((np.array(Max)-np.array(Min)) // (0.0025*boxsize))+1).sum() #ボックスカウント #以降ボックスサイズを2,4,8,16,32,64,128まで増やし同様の作業を行う

試したこと

def文で簡略化しようとしましたがfor文に変数を代入できないため上手くできませんでした。

補足情報(FW/ツールのバージョンなど)

CSVデータの中身はxy等間隔座標の130×130の縦横配列データで、インデックス、ヘッダーともに無しです。
for文で行っている作業は以下の通りです。(ボックスサイズ1のとき)
・x座標0~1,y座標0~1の4つのデータを一つのボックスとして切り出す。
・次のボックスの座標はx座標1~2、y座標0~1の4つのデータなので、その時の座標を指定する。
・x座標128まで来たら一段下、つまりy座標1~2に移動し、再びx座標0から128まで分割し続ける。
・これをx座標128、y座標128になるまで繰り返す。
この作業は、私が調べた限りでは既存のライブラリで代替できませんでした。
これをdef文で簡略化しようとすると、for文のrange関数の引数をボックスサイズごとに変更する必要があり、ここで詰まりました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

個人的に思うところはたくさんありますが,
質問は「解析時間を短縮したい」とのことなので,この点だけ。

サイズ0の配列を確保しappendで要素を追加しているところが遅くなる原因かもしれません。

C++等でもそう(pushとか)ですが,最終的にサイズが大きくなる可変配列は実行速度が遅くなる原因になることが多いです。
これは,pythonのインタプリタ内部で配列用にあらかじめ余分に確保しているメモリが足りなくなると,追加でメモリを確保する処理が間に入り,この時間が余分にかかるためです。

提示されているソースコードでは,MaxMinのリストのサイズが128×128と決まっているので,

python

1Max = [0.0] * 128 * 128 2Min = [0.0] * 128 * 128

とするか,numpyを読み込んでいるので,

python

1Max = np.zeros(128 * 128) 2Min = np.zeros(128 * 128)

とあらかじめ固定でサイズを確保しておき,for文の中では

python

1Max[num * 128 + div_col] = max 2Min[num * 128 + div_col] = min

とすると処理速度が上がるのではないでしょうか?

もちろん,全体のfor文の直前にidx=0を追加して,Max[idx]=max等とし,中のfor文の最後にidxをインクリメントする等でも構いません。

投稿2022/08/03 06:17

ujimushi_sradjp

総合スコア2087

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

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

fractal2310

2022/08/08 01:34

おっしゃる内容2つを試してみたのですが解析時間は変わりませんでした。 しかし、numpyに変換してnumpy配列のスライスに変更したら一瞬で解析ができるようになりました。 DataFrameでスライスしていたことが原因だったようです。 ご迷惑をおかけしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問