2012-12-05 27 views
6

Numpy, verileri (bitişik, dönüşümlü gerçek ve hayali bölüm) depolamaktan faydalanmak için numpy.complex64 alt sınıfını denemek için çalışıyorum ama kendi __add__, __sub__, ... rutinleri kullanın.Nümerik skaler türleri alt sınıflandırma

Benim sorunum dtype=mysubclass ayarı numpy.ndarray, yaparken, ben böyle devam eklemeler, subtractions ve benim kendi işlevlerini kullanmayan Numpy sonuçlanır yerine, içinde dtype='numpy.complex64' ile numpy.ndarray elde ediyoruz.

Örnek:

import numpy as np 
class mysubclass(np.complex64): 
    pass 

a = mysubclass(1+1j) 
A = np.empty(2, dtype=mysubclass) 

print type(a) 
print repr(A) 

Çıktı:

<class '__main__.mysubclass'> 
array([ -2.07782988e-20 +4.58546896e-41j, -2.07782988e-20 +4.58546896e-41j], dtype=complex64)' 

kimse bunun nasıl yapılacağını biliyor mu? peşin

Teşekkür - NumPy tipi sistemi sadece tasarlanmıştır Soren

+0

Bir testere son zamanlarda benzer bir soru olduğunu düşünüyorum, ancak şu anda bulamıyorum ... – NPE

cevap

3

PyArray_RegisterDataType fonksiyonu aracılığıyla, C'den uzatılması. Python'dan bu işlevselliğe erişmek için may olabilir, ancak bunu tavsiye etmem; C veya Cython'da bir uzantı yazmak veya @seberg'in açıkladığı gibi ndarray alt sınıfını yazmak daha iyidir.

NumPy kaynak ağacında basit bir örnek dtype var: newdtype_example/floatint.c. Pyrex'e girerseniz, piller kaynağında reference.pyx kaynağı bir göz atmaya değer olabilir.

+0

C'den uzak durmayı umuyordum, ama sanırım bu tür şeyler yaparken kaçınmak zor. Örneğe bakacağım ve şansımı deneyeceğim - teşekkürler! – Soren

3

Skalerlerin ve dizilerin numpy cinsinden oldukça farklı olduğunu unutmayın. np.complex64 (bu, sadece iki noktaya kadar değil, dikkat çekmek için 32 bitlik bir floattır). Bu diziyi değiştiremezsiniz, bunun yerine diziyi alt sınıflara ayırmanız ve ardından __add__ ve __sub__'u geçersiz kılmanız gerekir.

Yapmak istediğiniz tek şey bu ise, yalnızca bir dizinin alt sınıfının bu kadar basit olmaması nedeniyle yalnızca http://docs.scipy.org/doc/numpy/user/basics.subclassing.html'a bakmanız gerekir.

Yine de bu türü skaler olarak kullanmak isterseniz. Örneğin, skalerleri indekslemek istiyorsanız, en azından şu anda daha da zorlaşır. __array_wrap__'u, bazı küçültme işlevleri için skaler tipinize kendi skaler tipinize dönüştürmek üzere tanımlayarak biraz daha fazla alabilirsiniz, indekslemenin her durumda çalışmaya başladığını görünce, şu anda kendi __getitem__ kendi tanımınızı tanımlamış olabilirsiniz.

Bu yaklaşımla tüm durumlarda, karmaşık veri türünü kullanmaya devam edersiniz ve açıkça geçersiz kılınmayan tüm işlevler yine de aynı şekilde davranır. @ecatmur, eğer C dilinden yeni veri türleri yaratabileceğinizi belirtti, eğer gerçekten istediğin buysa.

+0

C'deki dtype oluşturmanın daha iyi bir yaklaşım olduğu görünüyor. Teşekkürler! – Soren