2016-03-29 10 views
2

Helle BuNumaralı diziyi semiy sembolleriyle dizine eklemek mümkün mü?

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 

gibi numpy dizide bazı toplamı yapmak istiyorum ama bir hata ile karşı karşıyayım. numpy arrays'indexes olarak numpy sembolleri işlemek mümkün mü? eğer değilse bana bir çözüm önerebilir misin? Teşekkürler.

+0

Neden sembolik toplamı kullanmak gerekiyor? Bu semboller için kullanmak istediğiniz herhangi bir özellik var mı? Bana göre normal toplamanın ihtiyaç duyduğunuz şey: 'sum (sum (a))'. İçteki toplam, satırlar üzerinden ikinci sütunların toplamıdır. Tersi ile ilgileniyorsanız, 'sum (sum (a.transpose())' işlevini kullanabilirsiniz. – juandesant

+0

juandesat diyebilirim ki bir sayı dizisi tarafından ifade edilen bir dizi piksel (Şekil, satır) P (i, j) 'nin P (i, j)' nin tüm numpy dizisindeki (i, j) 'de piksel olduğu merkezde 3 * 3 blok piksel halinde, istediğim, her biri için ortalama piksel değerini hesaplamaktır. 3 * 3 blok imajı P (i, j) 'nin yeni değeri olarak "i" ve "j" nin dinamiği olacaktır. Dizi sadece bir örnektir, fakat ben nümerik dizi için bir indis olarak semir sembollerini kullanıyorum. Teşekkürler –

+0

Sorularıma başka bir yönde de sorabilirim: örneğin bir python tamsayı değeri olarak bir semp sembolünün değerini almak mümkün mü? –

cevap

4

Numpy nesnelerini doğrudan SymPy ifadelerinde kullanamazsınız, çünkü numpy nesneleri sembolik değişkenlerle nasıl baş edeceğini bilmez. Bunun yerine, SymPy nesnelerini kullanarak sembolik olarak istediğiniz şeyi oluşturun ve sonra lambdify'u oluşturun. Sayısal dizinin SymPy sürümü IndexedBase'dir, ancak bununla ilgili bir hata vardır, dolayısıyla diziniz 2 boyutlu olduğu için MatrixSymbol'ı da kullanabilirsiniz.

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 

(aynı zamanda tam sayı sembolleri oluşturmak için doğru sözdizimi symbols('i j', integer=True) değil symbols('i j', Integer=True) olduğuna dikkat ediniz).

Desteklenmeyen a[i][j] yerine a[i, j] kullanmak zorunda olduğunuzu unutmayın.

2

MatrixSymbol, 2 boyutlu matrislerle sınırlıdır. Herhangi bir boyutta dizisine genelleştirmek için, ifadeyi IndexedBase ile oluşturabilirsiniz. lambdify, şu an IndexedBase ile uyumlu olmayan 'dır, ancak DeferredVectors ile kullanılabilir. Yani hile geçmesi olduğunu DeferredVectorlambdify bir:

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 
İlgili konular