浮点数和整数(numpy.float64s和numpy.int64s)在内存中的表示方式有所不同.以这些不同类型存储的值42对应于存储器中的不同位模式.
当您重新分配数组的dtype属性时,您将使基础数据保持不变,并告诉numpy以新的方式解释该位模式.由于现在的解释与数据的原始定义不匹配,因此最终会出现乱码(无意义的数字).
另一方面,通过.astype()转换数组实际上将转换内存中的数据:
>>> import numpy as np
>>> arr = np.random.rand(3)
>>> arr.dtype
dtype('float64')
>>> arr
array([ 0.7258989 , 0.56473195, 0.20885672])
>>> arr.data
>>> arr.dtype = np.int64
>>> arr.data
>>> arr
array([4604713535589390862, 4603261872765946451, 4596692876638008676])
正确的转换:
>>> arr = np.random.rand(3)*10
>>> arr
array([ 3.59591191, 1.21786042, 6.42272461])
>>> arr.astype(np.int64)
array([3, 1, 6])
如您所见,使用astype将有意义地转换数组的原始值,在这种情况下,它将截断为整数部分,并返回具有相应值和dt