의 NumPy 배열이 주어지면 int32
어떻게 float32
제자리 로 변환 합니까? 기본적으로 저는하고 싶습니다
a = a.astype(numpy.float32)
배열을 복사하지 않고. 그건 크다.
이 작업을 수행하는 이유는의 계산을위한 두 가지 알고리즘이 있기 때문입니다 a
. 그들 중 하나는의 배열을 int32
반환하고 다른 하나는의 배열을 반환합니다 float32
(이것은 두 가지 알고리즘에 내재되어 있습니다). 모든 추가 계산에서는이 a
배열이로 가정합니다 float32
.
현재 via라는 C 함수에서 변환을 수행합니다 ctypes
. 파이썬에서 이것을 할 수있는 방법이 있습니까?
답변
다른 dtype으로 뷰를 만든 다음 뷰에 적절한 위치로 복사 할 수 있습니다.
import numpy as np
x = np.arange(10, dtype='int32')
y = x.view('float32')
y[:] = x
print(y)
수확량
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.], dtype=float32)
변환이 제대로 이루어 졌음을 나타내려면 에서 x
에서 y
변경으로 복사하십시오 x
.
print(x)
인쇄물
array([ 0, 1065353216, 1073741824, 1077936128, 1082130432,
1084227584, 1086324736, 1088421888, 1090519040, 1091567616])
답변
업데이트 :이 기능은 가능한 경우 복사를 피 하므로이 질문에 대한 정답은 아닙니다. unutbu의 대답 이 옳습니다.
a = a.astype(numpy.float32, copy=False)
numpy astype에는 복사 플래그가 있습니다. 왜 우리는 그것을 사용해서는 안됩니까?
답변
다음과 같이 변환하지 않고 배열 유형을 변경할 수 있습니다.
a.dtype = numpy.float32
그러나 먼저 모든 정수를 해당 부동 소수점으로 해석되는 것으로 변경해야합니다. 이를 수행하는 매우 느린 방법은 다음 struct
과 같이 파이썬 모듈 을 사용하는 것입니다 .
def toi(i):
return struct.unpack('i',struct.pack('f',float(i)))[0]
… 어레이의 각 멤버에 적용됩니다.
그러나 아마도 가장 빠른 방법은 numpy의 ctypeslib 도구를 사용하는 것입니다.
– 편집하다 –
ctypeslib가 작동하지 않는 것 같으므로 일반적인 numpy.astype
방법으로 변환을 진행하지만 메모리 제한 내에있는 블록 크기로 진행합니다.
a[0:10000] = a[0:10000].astype('float32').view('int32')
… 완료되면 dtype을 변경하십시오.
다음은 호환 가능한 dtype에 대한 작업을 수행하고 (동일한 크기의 항목이있는 dtype에 대해서만 작동) 블록 크기를 사용자가 제어 할 수있는 임의의 모양 배열을 처리하는 함수입니다.
import numpy
def astype_inplace(a, dtype, blocksize=10000):
oldtype = a.dtype
newtype = numpy.dtype(dtype)
assert oldtype.itemsize is newtype.itemsize
for idx in xrange(0, a.size, blocksize):
a.flat[idx:idx + blocksize] = \
a.flat[idx:idx + blocksize].astype(newtype).view(oldtype)
a.dtype = newtype
a = numpy.random.randint(100,size=100).reshape((10,10))
print a
astype_inplace(a, 'float32')
print a
답변
import numpy as np
arr_float = np.arange(10, dtype=np.float32)
arr_int = arr_float.view(np.float32)
view () 및 매개 변수 ‘dtype’을 사용하여 배열을 변경하십시오.
답변
이것을 사용하십시오 :
In [105]: a
Out[105]:
array([[15, 30, 88, 31, 33],
[53, 38, 54, 47, 56],
[67, 2, 74, 10, 16],
[86, 33, 15, 51, 32],
[32, 47, 76, 15, 81]], dtype=int32)
In [106]: float32(a)
Out[106]:
array([[ 15., 30., 88., 31., 33.],
[ 53., 38., 54., 47., 56.],
[ 67., 2., 74., 10., 16.],
[ 86., 33., 15., 51., 32.],
[ 32., 47., 76., 15., 81.]], dtype=float32)
답변
a = np.subtract(a, 0., dtype=np.float32)