2011-03-29 18 views
7

Bazı alt özelliklerin yalnızca nesnenin orijinal şekli için geçerli olduğu bir dizi alt sınıfım var. Tüm dizi şekli değiştirme işlemlerinin, sınıfımın bir örneği yerine normal bir sayı dizisi döndürdüğünden emin olmanın bir yolu var mı?Tüm şekil değiştirme işlemlerinin normal bir dizi döndürdüğü bir numpy dizi alt sınıfı oluşturma

Zaten array_wrap yazdım, ancak bu np.mean, np.sum veya np.rollaxis gibi işlemler üzerinde herhangi bir etkisi yok gibi görünüyor. Bunlar sadece benim sınıfımın bir örneğini döndürüyor.

import numpy as np  

class NewArrayClass(np.ndarray): 
    __array_priority__ = 3.0 
    def __array_wrap__(self, out_arr, context=None): 
     if out_arr.shape == self.shape: 
      out = out_arr.view(new_array) 
      # Do a bunch of class dependant initialization and attribute copying. 
      # ... 
      return out 
     else: 
      return np.asarray(out_arr) 

A = np.arange(10) 
A.shape = (5, 2) 
A = arr.view(NewArrayClass) 
# Would like this to be np.ndarray, but get new_array_class. 
print type(np.sum(A, 0)) 

Ben __new__ veya __array_finalize__ şey yapmak zorunda anlamaya, ama ne bir ipucu yok.

Güncelleme: dikkatlice altsınıflamayla (http://docs.scipy.org/doc/numpy/user/basics.subclassing.html) üzerine numpy belgeleri okuduktan sonra tüm dizi şekil değiştirme işlemleri 'yeni şablondan' operasyonu yapıyoruz. Bu yüzden soru, sınıfımın örnekleri yerine 'şablondan yeni' geri dönüş ndarray örneklerini nasıl yapıyorsunuz? Anlatabildiğim kadarıyla, bu işlevler hiçbir zaman __new__'a çağrılmaz.

Alternatif: Yukarıda varsayarsak , nasıl en az (casting görüntülemek aksine) şablon operasyonundan yeni __array_finalize__ yılında tanımlarım mümkün değil mi? Bu, en azından referans ile kopyalanan bazı özniteliklerin atıfta bulunmasına izin verir. Yeni örneğe şeklinin geçersiz olduğunu belirten bir bayrak veya bir şey de ayarlayabilirim.

cevap

1

NewArrayClass örneklerine yeni üyeler tanıtmıyorsanız, döndürülen örneklerin __class__ özniteliğini yeniden atayabilirsiniz.

A.__class__ = np.ndarray 

Önemli olan, neden böyle bir şey yapmak istersiniz. Başka bir yerde sıkı tip kontrolüne mi giriyorsunuz? Ördek yazarak daha çok giderdin.

+0

Sınıfım yanlış biçimse, sınıfımda bir istisna oluşturacak yöntemlerim var. Bu yöntemleri erişilemez yapmak istiyorum. – kiyo

+0

Yani açıklanan yöntem sizin için çalışabilir. 'NewArrayClass' tarafından sunulan yöntemler, herhangi bir şekilde, '__class__' değiştirilmiş örneğe uygulanmayacaktır. – janislaw

+0

Bunu, "np.ndarray" gibi C uzantılarında tanımlanan sınıflarla yapmanıza izin verdiğinizi düşünmüyorum. Ben TypeError: __class__ atama olsun: sadece yığın türleri için. –