2016-03-29 26 views
2

ヘレ私はこのnumpy配列をsympyシンボルでインデックスすることはできますか?

import numpy as np 
import sympy as sy 
import cv2 

i, j = sy.symbols('i j', Integer=True) 
#next read some grayscale image to create a numpy array of pixels 
a = cv2.imread(filename) 
b = sy.summation(sy.summation(a[i][j], (i,0,1)), (j,0,1)) #double summation 

などのnumpyのアレイ上で、いくつかの集計をしたいが、私はエラーで直面しています。 numpyのシンボルをnumpyの配列のインデックスとして扱うことは可能ですか?あなたが私に解決策を与えることができない場合は?おかげさまで

+0

シンボリック合計を使用する必要があるのはなぜ?それらのシンボルに使用したいプロパティはありますか?通常の集計は、あなたが必要とするものであることを私に見せます: 'sum(sum(a))'。内側の 'sum'は、列の上、行の上の2番目の行の合計です。 – juandesant

+0

juandesat次のようにnumpy配列で表現された形状(行、列)を持つピクセルの配列を持っているとします。私はそれを分割します。 P(i、j)がnumpy配列全体の(i、j)のピクセルである各P(i、j)を中心とする3 * 3ブロックのピクセルに変換します。 3 * 3ブロックの画像をP(i、j)の新しい値とすることで、 "i"と "j"はダイナミクスになります。配列はちょうど例ですが、何がnumpy配列のインデクスとしてsympyシンボルを使うかです。ありがとう –

+0

私は別の方向で私の質問をすることもできます:例えばsympyシンボルの値をpythonの整数値として得ることは可能ですか? –

答えて

4

numpyオブジェクトはシンボリック変数の扱い方を知らないため、sympy式で直接numpyオブジェクトを使用することはできません。

代わりに、symPyオブジェクトを使用して記号的に必要なものを作成してからlambdifyとします。 numpy配列のSymPyバージョンはIndexedBaseですが、バグがあるようですので、配列が2次元なのでMatrixSymbolも使用できます。

In [49]: a = MatrixSymbol('a', 2, 2) # Replace 2, 2 with the size of the array 

In [53]: i, j = symbols('i j', integer=True) 

In [50]: f = lambdify(a, Sum(a[i, j], (i, 0, 1), (j, 0, 1))) 

In [51]: b = numpy.array([[1, 2], [3, 4]]) 

In [52]: f(b) 
Out[52]: 10 

(これも整数シンボルを作成するための正しい構文はsymbols('i j', integer=True)symbols('i j', Integer=True)ないことに注意してください)。

a[i][j]の代わりにa[i, j]を使用する必要がありますが、これはサポートされていません。

2

MatrixSymbolは2次元マトリックスに限定されています。任意の次元の の配列に一般化するには、式をIndexedBaseで生成できます。 lambdifyは現在IndexedBaseと互換性がない ですが、 DeferredVectorsと一緒に使用できます。だから、トリックはlambdifyDeferredVectorを渡している。

import sympy as sy 
import numpy as np 

a = sy.IndexedBase('a') 
i, j, k = sy.symbols('i j k', integer=True) 
s = sy.Sum(a[i, j, k], (i, 0, 1), (j, 0, 1), (k, 0, 1)) 
f = sy.lambdify(sy.DeferredVector('a'), s) 
b = np.arange(24).reshape(2,3,4) 

result = f(b) 
expected = b[:2,:2,:2].sum() 
assert expected == result 
関連する問題