2016-10-28 2 views
0

다른 유형의 데이터가 있습니다. 대부분은 int이고 때로는 float입니다. int의 크기가 다르므로 8/16/32 비트가 크기입니다.
이 경우 저는 수치 형 변환기를 만들고 있습니다. 따라서 isinstence()을 사용하여 형식을 확인합니다. 이것은 내가 isinstance()type()보다 덜 나쁘다고 읽었 기 때문입니다.numpy 배열 내의 체크 유형

요점은 내가 얻은 많은 데이터가 numpy 배열이라는 것입니다. 나는 IDE로 스파이더를 사용하고 그 다음에 변수를 볼 수 있습니다. 하지만 내가 isinstance(var,'type i read')이라고 입력하면 False이됩니다. 내가 얻을 수있다 isinstance(var,type)에 대한

a = 2.17 
b = 3 
c = np.array(np.random.rand(2, 8)) 
d = np.array([1]) 

: 내가 단계로 확인할 수 있습니다

isinstance(c, np.ndarray) 
True 
isinstance(d, np.ndarray) 
True 

을 요청하는 경우

isinstance(a, float) 
True 
isinstance(b, int) 
True 
isinstance(c, float) # or isinstance(c, np.float64) 
False 
isinstance(d, int) # or isinstance(c, np.int32) 
False 

cd에 해당

나는 몇 가지 검사를했다 ndarray by

isinstance(c[i][j], np.float64) 
True 
isinstance(d[i], np.int32) 
True 

그러나 이것은 모든 차원에 대해 새 색인을 추가해야한다는 것을 의미합니다. 그렇지 않으면 다시 False입니다. 내가 찾아 시도하는 것에 대해 있도록 나는 c.dtype == 'float64' 같은 dtype에이 유형 ...

두면를 확인하실 수 있습니다 ... 내 질문 basicly 있습니다

  • 방법 isinstance()과 비교 var.dtype 방법 type() (최악/개선 등)?
  • var.dtype이 더 악의적 인 경우 isinstance()은 수동 검색 기능이 전혀없는 에 몇 가지 방법이 있습니까? (자동 색인 생성 등)?
+0

이 데이터의 다른 정수 크기는? 파이썬 개체, numpy 배열, 파일로? 숫자 형 변환기를 사용하기 위해 더 많은 내용을 제공해야 할 수도 있습니다. – hpaulj

+0

대부분 멀티 채널 오디오 파일 –

+0

그리고 데이터 형식을 어떻게 변환 하시겠습니까? – hpaulj

답변

1

배열은 np.ndarray 유형의 개체입니다. 그 값 또는 요소는 메모리 버퍼의 연속 블록으로 생각할 수있는 데이터 버퍼에 저장됩니다. 데이터 버퍼의 바이트는 파이썬 객체가 아니기 때문에 유형이 없습니다.

배열에는 해당 바이트를 해석하는 데 사용되는 dtype 매개 변수가 있습니다. dtypeint32 (다양한 동의어가있는 경우) 인 경우 4 바이트는 정수로 해석됩니다. 예를 들어 c[0]과 같은 요소에 액세스하면 dtype에 따라 달라지는 새 개체가 생성됩니다. 객체 유형 np.int32.

c[0].item는 해당 유형의 파이썬 객체 줄 것이다 :

In [2102]: c=np.array([1]) 
In [2103]: c.dtype 
Out[2103]: dtype('int32') 
In [2104]: type(c) 
Out[2104]: numpy.ndarray 
In [2105]: type(c[0]) 
Out[2105]: numpy.int32 
In [2107]: c[0].item() 
Out[2107]: 1 
In [2108]: type(c[0].item()) 
Out[2108]: int 

(그리고 c[0].dtypec.dtype과 동일을, 당신은 자신의 DTYPE를 확인하기 위해 배열의 인덱스 개별 요소에 필요하지 않습니다).

이 배열의 동일한 4 바이트는 dtypeint8 - 단일 바이트 정수로 볼 수 있습니다.

In [2112]: c.view('b') 
Out[2112]: array([1, 0, 0, 0], dtype=int8) 

이 대체보기의 단일 요소는 np.int8입니다,하지만 난 item()을 때, 나는 파이썬의 정수를 얻을. int8 파이썬 숫자 형식이 없습니다.

In [2113]: type(c.view('b')[0]) 
Out[2113]: numpy.int8 
In [2115]: type(c.view('b')[0].item()) 
Out[2115]: int 

목록에는 각각 유형이있는 파이썬 객체에 대한 포인터가 들어 있습니다. dtype=object 배열도 마찬가지입니다. 그러나 일반 숫자 배열에는 파이썬 정수 또는 부동 소수점이 포함되지 않습니다. 그것은 dtype에 따라 다양한 방법으로 해석 할 수있는 데이터 버퍼를 가지고 있습니다. 파이썬 정수는 numpy dtypes만큼이나 다른 크기가 아닙니다.

따라서 isinstancetype()ndarray의 콘텐츠에는 적용되지 않습니다. 난 당신이 정수 배열이 떠로 변환하려고 모여 의견에서

====================

. 스칼라를 변환하지 않습니다. 그렇다면 dtype 모두 중요합니다. 배열은 항상 dtype입니다. np.float32 ~ np.float64을 전송해도 괜찮은지 여부는 불분명합니다.

나는 np.can_cast 함수와 x.astype 메서드를 공부하고 실험 해보는 것이 좋습니다.

x.astype(np.float64, copy=False) 

예를 들어 이미 float64 인 코드를 복사하지 않고 모든 int 유형을 float로 변환합니다. np.float32 것을 복사하여 변환 할 수 있습니다.

이 기능의 매개 변수는 casting입니다.

===========================

나는 scipy.optimize.minimize 다른 테스트 도구를 발견

In [156]: np.typecodes 
Out[156]: 
{'All': '?bhilqpBHILQPefdgFDGSUVOMm', 
'AllFloat': 'efdgFDG', 
'AllInteger': 'bBhHiIlLqQpP', 
'Character': 'c', 
'Complex': 'FDG', 
'Datetime': 'Mm', 
'Float': 'efdg', 
'Integer': 'bhilqp', 
'UnsignedInteger': 'BHILQP'} 

그것을 다음을 사용하여 정수를 확인하는 데 사용할 수 있습니다.

if x0.dtype.kind in np.typecodes["AllInteger"]: 
    x0 = np.asarray(x0, dtype=float) 
0

numpy 배열의 모든 항목은 동일한 유형입니다. numpy 타입과 Python 타입은 같은 것이 아닙니다. 이것은 다소 혼란 스럽지만, numpy 타입은 C와 같은 언어에서 사용되는 타입과 비슷합니다. 기계를 더 낮은 레벨에 가깝게 말할 수도 있습니다.

사과와 오렌지를 비교하는 것과 같을 수 있으므로 어떤 유형이 더 좋다고 말할 수는 없습니다.

+0

'모든 항목 ...같은 dtype'과'numpydtype'입니다. 'dtype'에 관계없이 배열의 타입은'ndarray'입니다. – hpaulj