前提・実現したいこと
画像のような構造の行列をPythonで効率的(高速で)作りたいです(h(i,j)等はi,jの関数)。for文を使いまくれば作れるとは思うのですが、Pythonらしく、numpy等を使ってforをなるべく使わずに作りたいです。numpyだと和の範囲が行列要素に依存しているような行列はうまくかけないのでしょうか、、、
(補足)
現在の僕のプロジェクトの計算の律速がこの行列作成となっているみたいなので、なるべく高速にこの行列を作る方法を御提示いただけると幸いです。具体的にはこのf(i,j,k)の関数系を少しづつ変えた行列を大量に作らなくては行けません。和の範囲の関数は変わりません。
![]
発生している問題・エラーメッセージ
少し具体化して例えばg(i,j) = j, h(i,j) = 7-i, f(i,j,k) = sin(i+j+k)として、添字は -2 <= i,j <= 2 という条件でこの行列を作るために、以下のようなコードを書くと、次のようなエラーが表示されます。ソースコードのnp.arange(i,7-j)のiとjには関数が呼び出された時にnumpy arrayが代入されているからだとはわかっているのですが、これをどうすればいいのかわかりません。ここが、和の範囲が行列要素に依存している部分です。
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
該当のソースコード
Python
1def test_func(i,j): 2 ini_array = np.arange(j,7-i) 3 return np.sin(i+j+ini_array).sum() 4 5ii, jj = np.mgrid[-2:3,-2:3] 6M_matrix = test_func(ii,jj)
試したこと
np.arrange(i,7-j)の部分をfor文で作っても結局は同じ問題に、、、(forの範囲があとで代入するnumpyに依存している)
補足情報(FW/ツールのバージョンなど)
python 3.7
import numpy as np
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/08 10:35