numbaによるnumpy利用アフィン変換の高速化

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 63

hashimo1994

score 0

前提・実現したいこと

このpython3のプログラムをnumbaで高速化するにはどうしたら良いでしょうか。
配列内にcsvファイルから取り込んだ3次元点軍の座標データを入れ、3次元のアフィン変換で座標変換をするプログラムです。

### 該当のソースコード
python3
import numpy as np
import pandas
import pickle
import redis
import numba
import time

# 時間計測用メソッド
def calctime(func):
    start = time()
    r = func()
    return {'value': r, 'time': time()-start}

#以下,希望するアフィン変換の関数

def zrot (yaw,x,y,z):
    return np.array([
        [1,0,0,x],
        [0,np.cos(yaw),-np.sin(yaw),y],
        [0,np.sin(yaw),np.cos(yaw),z],
        [0,0,0,1]])

def yrot (roll):
    return np.array([[np.cos(roll),0,np.sin(roll),0],
                [0,1,0,0],
                [-np.sin(roll),0,np.cos(roll),0],
                [0,0,0,1]])


def xrot (pitch):
    return  np.array([[np.cos(pitch),-np.sin(pitch),0,0],
                 [np.sin(pitch),np.cos(pitch),0,0],
                 [0,0,1,0 ],
                 [0,0,0,1]])






def main():

# csvの読み込み
    csv = pandas.read_csv('10[m]MergedFilecarXYZonly.csv',header=None)

# バージョン2のプロトコルを利用してバイト列をダンプ
    dumped = pickle.dumps(csv, protocol=2)

# ダンプしたバイト列をredisに保存
    r = redis.Redis(host='localhost', port=6379, db=0)
    r.set('10[m]MergedFilecarXYZonly.csv', dumped)



    A = pickle.loads(r.get('10[m]MergedFilecarXYZonly.csv'))

    return A
#npdataの形を、pandaで読み込んだデータフレームの形に変形する
#@numba.jit
def doit(A):
    npdata=np.array(A.values.flatten())

    print(npdata)
    print("\nok")
    XYZarray = np.reshape(npdata,(-1,3))

    yaw_tgt = 0*(np.pi/180)
    X_tgt = 0
    Y_tgt = 0
    Z_tgt = 0
    roll_tgt =0
    pitch_tgt = 0
    yaw_car = 0*(np.pi/180)
    X_car = 0
    Y_car = 0
    Z_car = 0
    roll_car = 0
    pitch_car = 0
#affin = np.empty(4,4,dtype=np.float64)
#A = np.empty(4,4,dtype=np.float64)
#B = np.empty(4,4,dtype=np.float64)
#C = np.empty(4,4,dtype=np.float64)

    A = np.dot(zrot(yaw_tgt,X_tgt,Y_tgt,Z_tgt) ,yrot(roll_tgt))
    B = np.dot(xrot(pitch_tgt), zrot((-1)*yaw_car,(-1)*X_car,(-1)*Y_car,Z_car))
    C = np.dot(yrot((-1)*roll_car),xrot((-1)*pitch_car))

    affin = np.dot(A,B)
    affin = np.dot(affin,C)

#座標変換用のアフィン変換行列affinをデータの転地行列にかける
    XYZarray2 = np.empty(np.shape(XYZarray.T))

    Dot_af =  np.vstack( (XYZarray.T,np.ones(np.shape(XYZarray.T[0,:]))))
    XYZarray_af = np.dot(affin , Dot_af)
    XYZarray2 = XYZarray_af[0:3,:].T

#print(XYZarray)

    print("2tつめ")
    print(XYZarray2)
    print("おk")




start = time.time()
B = main()
doit(B)
print("original took %f s" %(time.time() - start))


```

試したこと

def doit()の上に@numba.jit を書いてみましたが以下のメッセージが出て低速化します(書く前:0.013074 s→書いた後:0.815948 s)
zenbuyasoudan.py:67: NumbaWarning: 
Compilation is falling back to object mode WITH looplifting enabled because Function "doit" failed type inference due to: Untyped global name 'zrot': cannot determine Numba type of <class 'function'>

File "zenbuyasoudan.py", line 92:
def doit(A):
<source elided>

A = np.dot(zrot(yaw_tgt,X_tgt,Y_tgt,Z_tgt) ,yrot(roll_tgt))
^

@numba.jit
/home/hiroki/anaconda3/lib/python3.7/site-packages/numba/compiler.py:725: NumbaWarning: Function "doit" was compiled in object mode without forceobj=True.

File "zenbuyasoudan.py", line 68:
@numba.jit
def doit(A):
^

self.func_ir.loc))
/home/hiroki/anaconda3/lib/python3.7/site-packages/numba/compiler.py:734: NumbaDeprecationWarning: 
Fall-back from the nopython compilation path to the object mode compilation path has been detected, this is deprecated behaviour.

For more information visit http://numba.pydata.org/numba-doc/latest/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit

File "zenbuyasoudan.py", line 68:
@numba.jit
def doit(A):
^

warnings.warn(errors.NumbaDeprecationWarning(msg, self.func_ir.loc))

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

環境はubuntu18.04でvsdodeとanacondaを用いています

どうかよろしくお願い申し上げます

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

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

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る