[python] NumPy 배열의 적절한 유형 변환

의 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)


답변