アプリ版:「スタンプのみでお礼する」機能のリリースについて

・スライス機能で数値計算を行うにあたり処理の条件分岐ができるように実現したいです。

現在、2次元配列の数値計算のプログラムを作成しています。
以前作成した2重ループの数値計算のプログラムでは問題なく
前ステップの値(i-194)が-1より小さかったら処理1
前ステップの値(i-194)が-1より大きかったら処理2
となるような計算はされていますが配列が巨大なためものすごく時間がかかってしまいます(下に載せてあります)。
ということもありスライス機能を使って高速化させようと思ったのですが、一度にすべて計算してしまうスライス機能で処理の条件分岐ができるのか知りたいです。
またほかの良い方法がありましたら是非ご教授宜しくお願い致します...


#2重ループの数値計算のプログラム
c1=1190000
c2=113000000
c3=1.66
h1=0.003
kf1=0.00034
kl1=0.0004
x=1.2

for i in range(194, prd.shape[0]):
for j in range(prd.shape[1]):
if prd[i-194,j]<=-1:
prd[i,j]=prd[i-194,j]+2/(x*np.log(c1+c2/(0-prd[i-194,j])**c3))*(h1*(24-prd[i-194,j])+(kf1+(kl1-kf1)*(0+1)/(0-prd[i-194,j]))*(prd[i-194,j-1]-2*prd[i-194,j]+prd[i-194,j+1])/x)

else:
prd[i,j]=prd[i-194,j]+2/(x*np.log(c1))*(h1*(24-prd[i-194,j])+kl1*(prd[i-194,j-1]-2*prd[i-194,j]+prd[i-194,j+1])/x)


#スライスのプログラム
c1=1190000
c2=113000000
c3=1.66
h1=0.003
kf1=0.0034
kl1=0.004
x=1.2

for i in range(194, prd.shape[0]):
for j in range(1, prd.shape[1]):

if prd[i-194, j]<=-1:
prd[i, 1:]=prd[i-194, 1:]+2/(x*np.log(c1+c2/(0-prd[i-194, 1:j])**c3))*(h1*(24-prd[i-194, 1:])+(kf1+(kl1-kf1)*(0+1)/(0-prd[i-194, 1:]))*(prd[i-194, 0:-1]-2*prd[i-194, 1:]+prd[i-194, 2:])/x)

if prd[i-194, 1:]>-1:
prd[i, 1:]=prd[i-194, 1:]+2/(x*np.log(c1))*(h1*(24-prd[i-194, 1:])+kl1*(prd[i-194, 0:-1]-2*prd[i-194, 1:]+prd[i-194, 2:])/x)

A 回答 (2件)

numpyでループ使ったら逆に遅くなりそうで意味ないと思う。


よく読んでないけど roll とか where で工夫すればなんとかなりそう。
    • good
    • 1

1. 動かないコードを提示されてもどうしようもない。


2. prdが何を表してるか分からない。
3. 「数値計算」って言われても何が目的なんだかサッパリ分からない。

の3点で、なんとも答えようがないんじゃないかしら。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!