2016-09-21 2 views
0

컨텍스트 : numpy ndarraysfloat32 대신 float64 대신 사용하고 싶습니다.numpy에서 dtype =과 .astype()의 차이점은 무엇입니까?

편집 : 추가 컨텍스트 - 신경망에서 backpropagation 루틴의 일부로 반복적으로 발생하기 때문에 numpy이 이러한 호출을 실행하는 방법에 대해 우려하고 있습니다. 결과를 다른 그룹의 작업과 비교하기 위해 유효성 검사를 위해 그물이 모든 덧셈/뺄셈/곱셈/나눗셈을 float32에서 수행하고 싶습니다. randn과 같은 메소드의 초기화는 항상 float64 ->float32에서 캐스팅은 .astype()이 될 것입니다. 예를 들어 을 사용하는 경우 ndarray의 유형이 float32 인 경우 해당 승수는 float32에서 발생합니까? 어떻게 확인할 수 있습니까?

문서는 나에게 분명하지 않다 - http://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html

가 난 그냥, 예를 들어, NumPy와 통화 끝에 np.random.randn(y, 1).astype('float32').astype('float32')을 추가 할 수 있습니다 알아 냈어.

또한 dtype=np.float32이 옵션 인 것으로 확인됩니다 (예 : np.zeros(5, dtype=np.float32)).

b = np.random.randn((3,1), dtype=np.float32) 
TypeError: randn() got an unexpected keyword argument 'dtype' 

dtype.astype()를 사용하여 사용 float32 같은 유형 선언의 차이점은 무엇입니까 : 그러나, np.random.randn((y, 1), dtype=np.float32) 반환 다음과 같은 오류를 시도? 두 b = np.zeros(5, dtype=np.float32)b = np.zeros(5).astype('float32')

평가할 :

print(type(b)) 
print(b[0]) 
print(type(b[0])) 

인쇄 :

[ 0. 0. 0. 0. 0.] 
<class 'numpy.ndarray'> 
0.0 
<class 'numpy.float32'> 
+0

함수가'dtype' 매개 변수를 받아들이면 사용하십시오. 이 매개 변수를 허용하지 않으면'astype '을 사용해야합니다. 효과는 동일해야합니다 (대부분의 경우). 'dtype'을 받아들이는 함수는 리턴 표현식에'astype' (또는 이와 동등한 것)을 사용할 것입니다. – hpaulj

+0

Thanks @ hpaulj,'dtype'보다'astype()'가 더 널리 받아 들여지고 있습니까? 둘째,'astype()'가 임시 float64 배열을 먼저 강제로 복사하고 사용자가 제공하는 모든 유형으로 캐스팅하기 전에 알고 있는지? temp 배열을 먼저 만들지 않고'float32'' ndarray's'를 얻을 수있는 방법이 있습니까? – bobo

답변

2

은 내가 코멘트에보고 있어요 혼란의 일부를 해결할 수 있는지 보자.

In [609]: x=np.arange(5) 
In [610]: x 
Out[610]: array([0, 1, 2, 3, 4]) 
In [611]: x.dtype 
Out[611]: dtype('int32') 

arange의 기본은 INT32를 만드는 것입니다 :

배열을 확인합니다.

astype은 배열 방법입니다. 그것은 임의의 어레이에서 사용될 수

In [612]: x.astype(np.float32) 
Out[612]: array([ 0., 1., 2., 3., 4.], dtype=float32) 

arange는 또한 먼저 int 배열을 생성하고 변환을하거나 만들어 여부 dtype 파라미터

In [614]: np.arange(5, dtype=np.float32) 
Out[614]: array([ 0., 1., 2., 3., 4.], dtype=float32) 

걸리는 float32 직접 나 어떤 문제 없다 . 컴파일 된 코드로 수행되는 기본 작업입니다.

또한 float stop 값을 제공 할 수 있습니다.이 경우 float 배열 (기본 float 유형)이 제공됩니다.

In [615]: np.arange(5.0) 
Out[615]: array([ 0., 1., 2., 3., 4.]) 
In [616]: _.dtype 
Out[616]: dtype('float64') 

zeros은 유사하다. 기본 dtype은 flort64이지만 매개 변수를 사용하면 변경할 수 있습니다. 메모리를 할당하는 것이 주된 작업이고 계산을 할 필요가 없기 때문에 더 이상 변환하지 않고 원하는 dtype을 즉시 생성 할 수 있습니다. 그러나 다시 말하지만, 이것은 컴파일 된 코드이며, 커버 밑에서 무엇을하는지 걱정할 필요가 없습니다.

In [618]: np.zeros(5) 
Out[618]: array([ 0., 0., 0., 0., 0.]) 
In [619]: _.dtype 
Out[619]: dtype('float64') 
In [620]: np.zeros(5,dtype=np.float32) 
Out[620]: array([ 0., 0., 0., 0., 0.], dtype=float32) 

randn

계산을 많이 포함하고, 분명히 기본 플로트 타입와 함께 작동하도록 컴파일됩니다. dtype을 사용하지 않습니다. 그러나 결과가 배열이므로 astype을 사용하여 캐스팅 할 수 있습니다.

In [623]: np.random.randn(3) 
Out[623]: array([-0.64520949, 0.21554705, 2.16722514]) 
In [624]: _.dtype 
Out[624]: dtype('float64') 
In [625]: __.astype(np.float32) 
Out[625]: array([-0.64520949, 0.21554704, 2.16722512], dtype=float32) 

astype은 배열의 한 방법입니다. 배열의 값을 취하여 dtype을 가진 새로운 배열을 만든다. 배열 자체 또는 해당 배열을 만든 함수에서 소급하여 (또는 적절한 위치에서) 작동하지 않습니다.

astype의 효과는 종종 dtype 매개 변수와 동일하지만 (항상?) 동작 순서는 다릅니다.

https://stackoverflow.com/a/39625960/901925에서 나는 dtype 매개 변수를 취하고 마지막에 astype 메서드 호출을 사용하여이를 구현하는 스파 스 매트릭스 생성자를 설명합니다.

dot 또는 *과 같은 계산을 수행하면 출력 dtype을 입력과 일치 시키려고 시도합니다. 혼합 유형의 경우에는 더 높은 정밀도 대안을 사용합니다.

In [642]: np.arange(5,dtype=np.float32)*np.arange(5,dtype=np.float64) 
Out[642]: array([ 0., 1., 4., 9., 16.]) 
In [643]: _.dtype 
Out[643]: dtype('float64') 
In [644]: np.arange(5,dtype=np.float32)*np.arange(5,dtype=np.float32) 
Out[644]: array([ 0., 1., 4., 9., 16.], dtype=float32) 

캐스팅 규칙이 있습니다. 사람들을 찾아 볼 수있는 한 가지 방법은 can_cast 기능입니다 :

In [649]: np.can_cast(np.float64,np.float32) 
Out[649]: False 
In [650]: np.can_cast(np.float32,np.float64) 
Out[650]: True 

그것은 32 64으로 캐스팅 계산을 수행 한 후 목적은 피할 것 (32)에 다시 캐스팅 할 몇 가지 계산이 가능하다 반올림 오류. 그러나 나는 당신이 그것을 문서 또는 시험에서 어떻게 발견했는지 모른다.

+0

고마워요 - 나는'numpy'가 신경망에서 backpropagation 루틴의 일부로 반복적으로 발생하기 때문에 이러한 호출을 어떻게 실행하는지 걱정합니다. 결과를 다른 그룹의 작업과 비교하려면 유효성 검사를 위해 'float32'에있는 모든 덧셈/뺄셈/곱셈/나눗셈을 그물에서 수행하고 싶습니다. 'randn'과 같은 메소드의 초기화는'float64' ->'float32'에서'.astype()'casting으로 항상 진행됩니다. 예를 들어'np.dot '을 사용하면 내'ndarray '유형이'float32'가되면'float32'에서 곱셈이 발생합니까? 어떻게 확인할 수 있습니까? – bobo

+0

설명서가 나에게 명확하지 않음 - http://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html – bobo

+1

'np.dot'가 일부 외부에서 루틴을 호출하는 numpy 코드를 컴파일했습니다. 도서관 (BLAS, ATLAS 등). 나는 그것들 중 대부분이 float과 double 버전을 모두 가지고 있다고 생각하며 입력과 가장 호환되는 버전을 선택한다. 그러나 당신은'numpy' 소스 코드를 파헤쳐 야합니다. – hpaulj

0

.astype() 데이터를 복사.

>>> a = np.ones(3, dtype=float) 
>>> a 
array([ 1., 1., 1.]) 
>>> b = a.astype(int) 
>>> b 
array([1, 1, 1]) 
>>> np.may_share_memory(a, b) 
False 

주 그 DTYPE이 실제로 같은 경우에도 astype() 데이터를 복사 :

>>> c = a.astype(float) 
>>> np.may_share_memory(a, c) 
False 
+0

'.astype()'을 사용하여'ndarray'가 선언 된 인라인의 경우이게 무슨 뜻입니까? 여분의 무언가가 여기에 복사되고 있습니까? – bobo

+0

'np.ones (3, dtype = float) .astype (int)'을 의미합니까? 네, 우선 임시 배열을 생성하고 그 값을 복사하고 int로 값을 변환 한 다음 임시를 버립니다. –

+0

아니요, 다음과 같습니다 :'np.ones (3) .astype ('float32')'- 이것은 처음에'float64' 항목의 임시 배열을 생성 한 다음 캐스팅 된'float32' 버전의 배열을 다른 기억에있는 위치와 원본을 파괴? 아니면 그냥'float32' 배열을 만드시겠습니까? – bobo

관련 문제