2016-06-09 21 views
12

, tercihan bir tek koşul (yani bir or) kullanılarak, bir değişken int veya np.int*, np.uint* herhangi birine ait olup olmadığını test etmek gerekir.Bir sayının int türünde mi (çekirdek mi, uyuşmuş, imzalı mı değil mi) nasıl belirlenir?

bazı testlerden sonra, sanırım o:

  • isinstance(n, int) sadece maç olacak int ve np.int32 (veya np.int64 plateform bağlı olarak),
  • np.issubdtype(type(n), int)
  • tüm int ve np.int* maç gibi görünüyor, ama uymuyor np.uint*.

Bu iki soruya yol açar: will np.issubdtype maç imzalı ints herhangi tür? Herhangi bir sayının herhangi bir imzalı veya imzasız int olup olmadığını tek bir kontrolde belirleyebilir mi?

Bu, tam sayıları için test etme ile ilgilidir, test, float-like için False değerini döndürmelidir.

cevap

16

NumPy Python türleri yerine alt tür denetimi için kullanabileceğiniz/kullanmanız gereken temel sınıflar sağlar.

İmzalı veya imzasız tam sayıların olup olmadığını kontrol etmek için np.integer kullanın. Imzalı türleri veya imzasız türleri denetlemek için np.signedinteger ve np.unsignedinteger kullanın.

>>> np.issubdtype(np.uint32, np.integer) 
True 
>>> np.issubdtype(np.uint32, np.signedinteger) 
False 
>>> np.issubdtype(int, np.integer) 
True 

Tüm yüzen veya test edildiğinde karmaşık sayı türleri False dönecektir. Python int imzalı bir tür olduğundan, her zaman False olacaktır.

Tüm bu temel sınıflar arasındaki ilişkiyi gösteren yararlı bir başvuru, here numaralı belgede bulunmaktadır. np.issutype 'ile ilgili açıklamalar için

enter image description here

+3

Kesinlikle oy veriyorum, bu test için izin veriyor ile: 'isinstance (n, (int, np.integer))'. –

1

Python isinstance() yerleşik işlevine bir tür tuple geçirmeyi öneririm. Ve np.issubtype() ile ilgili sorunuza ilişkin olarak, herhangi bir tür imzalanmış girişle eşleşmiyor, bir sınıfın ikinci bir sınıfın alt sınıfı olup olmadığını belirliyor. Ve tüm tamsayı türleri (int8, int32, vb), int alt sınıfları olduğundan, bu türlerden birini int ile birlikte geçirirseniz True döndürecektir. daha genel bir yaklaşım olarak size np.isreal() kullanabilirsiniz (yalnızca bazı özel türlerini eşleştirmek istediğinizde uygun değildir), Ayrıca

>>> a = np.array([100]) 
>>> 
>>> np.issubdtype(type(a[0]), int) 
True 
>>> isinstance(a[0], (int, np.uint)) 
True 
>>> b = np.array([100], dtype=uint64) 
>>> 
>>> isinstance(b[0], (int, np.uint)) 
True 

: Burada

bir örnektir

>>> np.isreal(a[0]) 
True 
>>> np.isreal(b[0]) 
True 
>>> np.isreal(2.4) # This might not be the result you want 
True 
>>> np.isreal(2.4j) 
False 
+0

sayesinde()'.'Isinstance()' da listelenen listeleme türlerinin çalışacağını tahmin ediyorum, ancak bunu yapmaktan kaçınmak istiyorum, çünkü bu, isinstance (n, (int, np.int, np.int0, np.int8, np.int16, ), np.uint, ) Daha az pythonik düşünemiyorum –

+0

@ArcturusB Bu durumda, daha genel bir tür ve üst tamsayı kullanmak isteyebilirsiniz: http: // docs yazarak numpy verisine göz atın. .scipy.org/doc/numpy-1.10.1/user/basics.types.html – Kasramvd

+0

Gerçekten de, ajcr tarafından önerilen gibi 'np.integer' kullanımı iyi çalışıyor, teşekkürler! –