은 내가 코멘트에보고 있어요 혼란의 일부를 해결할 수 있는지 보자.
이
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)에 다시 캐스팅 할 몇 가지 계산이 가능하다 반올림 오류. 그러나 나는 당신이 그것을 문서 또는 시험에서 어떻게 발견했는지 모른다.
함수가'dtype' 매개 변수를 받아들이면 사용하십시오. 이 매개 변수를 허용하지 않으면'astype '을 사용해야합니다. 효과는 동일해야합니다 (대부분의 경우). 'dtype'을 받아들이는 함수는 리턴 표현식에'astype' (또는 이와 동등한 것)을 사용할 것입니다. – hpaulj
Thanks @ hpaulj,'dtype'보다'astype()'가 더 널리 받아 들여지고 있습니까? 둘째,'astype()'가 임시 float64 배열을 먼저 강제로 복사하고 사용자가 제공하는 모든 유형으로 캐스팅하기 전에 알고 있는지? temp 배열을 먼저 만들지 않고'float32'' ndarray's'를 얻을 수있는 방법이 있습니까? – bobo