2016-03-29 8 views
2

Helle Ich möchte ähnlicheIst es möglich, ein numpy Array mit sympy Symbolen zu indizieren?

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 

eine Summierung auf einem numpy Array zu tun, aber ich bin mit einem Fehler konfrontiert. Ist es möglich, numpy Symbole als numpy arrays'indexes zu behandeln? Wenn nicht, kannst du mir eine Lösung anbieten? Danke.

+0

Warum benötigen Sie symbolische Summe benutzen? Gibt es eine Eigenschaft, die Sie für diese Symbole verwenden möchten? Es sieht für mich aus, dass eine normale Addition das ist, was Sie brauchen: 'sum (sum (a))'. Die innere "Summe" summiert sich über Spalten, zweite über Zeilen. Wenn Sie an der Umkehrung interessiert sind, können Sie stattdessen 'sum (sum (a.transpose())' – juandesant

+0

juandesat sagen Ich habe ein Array von Pixeln mit Form (row, col) ausgedrückt durch ein numpiges Array als nächstes teile ich es in 3 * 3 Blöcke von Pixeln, zentriert in jedem P (i, j), wobei P (i, j) die Pixel bei (i, j) in der ganzen numpy array ist, was ich will ist, den durchschnittlichen Pixelwert für jede zu berechnen 3 * 3 Blöcke Bild als der neue Wert von P (i, j) so "i" und "j" wird Dynamik sein. Das Array ist nur ein Beispiel, aber was ich, was Sympy Symbole als ein Indiz für numpy Array verwenden soll. Danke –

+0

Ich kann meine Frage sogar in eine andere Richtung stellen: Ist es möglich, den Wert eines Sympy-Symbols als Python-Integer-Wert zu erhalten? –

Antwort

4

Sie können numpy Objekte nicht direkt in SymPy-Ausdrücken verwenden, da numpy Objekte nicht wissen, wie sie mit symbolischen Variablen umgehen sollen.

Erstellen Sie stattdessen das Objekt, das Sie symbolisch verwenden möchten, mithilfe von SymPy-Objekten und dann lambdify. Die SymPy-Version eines numpligen Arrays ist IndexedBase, aber es scheint, dass es einen Fehler damit gibt. Da Ihr Array 2-dimensional ist, können Sie auch MatrixSymbol verwenden.

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 

(beachten Sie auch, dass die korrekte Syntax für die Erstellung von Symbolen integer ist symbols('i j', integer=True), nicht symbols('i j', Integer=True)).

Beachten Sie, dass Sie a[i, j] anstelle von a[i][j] verwenden müssen, was nicht unterstützt wird.

2

MatrixSymbol ist auf 2-dimensionale Matrizen beschränkt. Um Arrays von beliebigen Dimensionen zu verallgemeinern, können Sie den Ausdruck mit IndexedBase generieren. lambdify ist derzeit inkompatibel mit IndexedBase, aber es kann mit DeferredVectors verwendet werden. So ist der Trick lambdify ein DeferredVector weitergeben müssen:

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 
Verwandte Themen