2016-03-29 43 views
2

赫勒我想要做一些总结一个numpy的阵列上这样是否有可能用sympy符号索引numpy数组?

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符号?如果不是,你可以给我一个解决方案吗? 谢谢。

+0

为什么你需要使用符号求和?有没有什么财产要用于这些符号?在我看来,正常的总和就是你所需要的:'sum(sum(a))'。内部的'sum'在列上总结,在行上重复。如果你有兴趣,可以使用'sum(sum(a.transpose())'代替 – juandesant

+0

juandesat说我有一个由numpy数组表示的形状(row,col)的像素数组,接下来我将它分开(i,j)是整个numpy阵列中(i,j)处的像素的3 * 3个像素块,我想要的是计算每个像素的平均像素值3 * 3块图像作为P(i,j)的新值,所以“i”和“j”将是动态的。数组只是一个例子,但是我使用sympy符号作为numpy数组的一个指示。谢谢 –

+0

我甚至可以问我的问题在另一个方向:?是有可能得到一个sympy符号,例如蟒蛇整数值的数值 –

回答

4

不能直接使用在SymPy表达numpy的对象,因为numpy的对象不知道如何处理符号变量。

相反,创建要象征性地使用SymPy对象的东西,然后lambdify它。 numpy数组的SymPy版本是IndexedBase,但它似乎有一个bug,所以,因为你的数组是二维的,所以你也可以使用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使用。因此,关键是传递一个DeferredVectorlambdify

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