2016-10-25 2 views
0

numpy 형식의 유효성 검사를 구현하려고합니다. 특히 np.longdouble이 80 비트 확장 정밀도 부동 소수점 인 경우 - 패딩을 사용하여 원시 바이트 크기를 가져옵니다.numpy dtype 정보 얻기

Accured to dtype docs, 나는 속성으로부터 많은 정보를 얻을 수 있습니다. 그러나 내가 확인한 속성 중 어느 것이 든

In [23]: np.longdouble.nbytes 
Out[23]: <attribute 'nbytes' of 'numpy.generic' objects> 

숫자 대신에 얻을 수 있습니다.

np.finfo(np.longdouble)에서 많은 정보를 얻을 수 있지만 바이트 크기는 포함되지 않습니다.

확실히, 그 유형의 배열을 생성하고 크기 또는 무언가를 계산할 수 있지만 특정 인스턴스에 바인딩되지 않은 정보를 얻으려면 정말 필요합니까?

+1

도움이 되셨습니까? - http://stackoverflow.com/questions/16972501/numpy-size-of-data-type – Divakar

답변

2

Numpy size of data type에 따르면 실제로는 실제 속성 값을 얻으려면 np.dtype(<type>)이 필요합니다. 기묘한! 합니다 (dump 모듈을 사용) 여기서

:

In [27]: dump(np.dtype(np.longdouble)) 
alignment : 8 
base : float64 
byteorder : = 
char : g 
descr : [('', '<f8')] 
fields : None 
flags : 0 
hasobject : False 
isalignedstruct : False 
isbuiltin : 1 
isnative : True 
itemsize : 8 
kind : f 
metadata : None 
name : float64 
names : None 
num : 13 
shape :() 
str : <f8 
subdtype : None 
type : <type 'numpy.float64'> 

이 출력 win32 플랫폼 파이썬 2.7, predictably로되고, 오히려 여기 np.longdouble 확장 정밀도보다 두 배이다.

alignment : 4 
base : float96 
byteorder : = 
char : g 
descr : [('', '<f12')] 
fields : None 
flags : 0 
hasobject : False 
isbuiltin : 1 
isnative : True 
itemsize : 12 
kind : f 
metadata : None 
name : float96 
names : None 
num : 13 
shape :() 
str : <f12 
subdtype : None 
type : <type 'numpy.float96'> 
+0

어떤 버전을 실행하고 있습니까? OS? 나는 리눅스 3.5+에서 12의 itemsize를 얻는다. – hpaulj

+0

@hpaulj 2.7 for win32. 출력은 단지 예일뿐입니다. 나는 모든 종류의 플랫폼에서 모든 가능한 결과물로 답을 혼란스럽게하고 싶지 않습니다.이 효과에 대한 메모를 추가했습니다. 결국, 질문은 80 비트로'np.longdouble'의 유효성을 검사하는 모든면보다는 값을 얻는 것에 관한 것입니다. –

2

인스턴스 경로를가는 :

In [1586]: np.array(1,np.longdouble) 
Out[1586]: array(1.0, dtype=float96) 
In [1587]: np.longdouble(1).nbytes 
Out[1587]: 12 

In [1588]: np.dtype(np.longdouble) 
Out[1588]: dtype('float96') 

기본 플로트 float64입니다

는 비교를 위해, 여기가 확장 된 것 86에 CentOS 6의 출력입니다.

nbytes은 클래스의 속성이 아니라 인스턴스의 속성입니다. 이러한 구별은 Python에서 매우 일반적입니다. 유형

In [1592]: dt=np.dtype(np.longdouble) 
In [1593]: dt 
Out[1593]: dtype('float96') 
In [1594]: dt.descr 
Out[1594]: [('', '<f12')] 
In [1595]: dt.itemsize 
Out[1595]: 12 

np.typeDict지도 코드 : 나는 그것에서 dtype 개체를 만들 경우

. 그리고 형식 이름은 종종 크기를 나타냅니다.

In [1600]: np.typeDict['longdouble'] 
Out[1600]: numpy.float96 

=================== np.dtype(dtype)

finfo 시작됩니다. 따라서 dt.itemsize은 이와 같은 유형의 바이트 크기를 가져 오는 올바른 방법입니다.

dtype은 동의어가 많으므로 np.dtype과 같은 '중앙 정보 교환소'를 사용하는 것이 좋습니다. 그리고 컴파일러에 대한 의존성이 있기 때문에 일부 속성은 일부 파이썬 클래스 정의에서 하드 코딩 된 것과 달리 런타임시 파생되어야합니다.

+0

주 :'typeDict'는 문서화되지 않았습니다. –

+1

'github' 검색에서 문서 참조가 표시되지 않습니다. 그러나 그것은'numpy/numpy/core/numerictypes.py'에서 만들어집니다. – hpaulj