2016-03-29 51 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