¿Es posible indexar una matriz numpy con símbolos sympy?

Helle, quiero hacer un resumen en una matriz numpy como esta

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 

Pero me estoy enfrentando con un error. ¿Es posible manejar símbolos numpy como índices de arrays numpy? Si no puedes sugerirme una solución? Gracias.

No puede usar el objeto numpy directamente en las expresiones SymPy, porque los objetos numpy no saben cómo manejar las variables simbólicas.

En su lugar, cree lo que quiere simbólicamente utilizando objetos SymPy y luego lambdify . La versión SymPy de una matriz numpy es IndexedBase, pero parece que tiene un error, por lo que, dado que su matriz es bidimensional, también puede usar 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 

(también tenga en cuenta que la syntax correcta para crear símbolos de enteros son los symbols('i j', integer=True) , no los symbols('i j', Integer=True) ).

Tenga en cuenta que debe usar a[i, j] lugar de a[i][j] , que no es compatible.

MatrixSymbol está limitado a matrices bidimensionales. Para generalizar a matrices de cualquier dimensión, puede generar la expresión con IndexedBase . lambdify actualmente es incompatible con IndexedBase , pero se puede usar con DeferredVectors . Así que el truco es pasar un DeferredVector para lambdify :

 import sympy as sy import numpy as np a = sy.IndexedBase('a') i, j, k = sy.symbols('ij 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