python中dtype的⽤法_python-在NumPy数组中使⽤
array.dtype。。。
浮点数和整数(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将有意义地转换数组的原始值,在这种情况下,它将截断为整数部分,并返回具有相应值和dtype的新数组.
请注意,分配新的dtype不会触发任何检查,因此您可以对数组进⾏⾮常奇怪的处理.在上⾯的⽰例中,浮点数的64位被重新解释为64位的整数.但是您也可以更改位⼤⼩:
>>> arr = np.random.rand(3)
>>> arr.shape
random在python中的意思(3,)
>>> arr.dtype
dtype('float64')
>>> arr.dtype = np.float32
>>> arr.shape
(6,)
>>> arr
array([ 4.00690371e+35, 1.87285304e+00, 8.62005305e+13,
1.33751166e+00, 7.17894062e+30, 1.81315207e+00], dtype=float32)
通过告诉numpy您的数据所占空间是原始空间的⼀半,numpy会推断出您的数组中元素的数量是原来的两倍!显然不是您应该做的.
另⼀个⽰例:考虑8位⽆符号整数255 == 2 ** 8-1:它对应于⼆进制的11111111.现在,尝试将其中两个数字重新解释为单个16位⽆符号整数:
>>> arr = np.array([255,255],dtype=np.uint8)
>>> arr.dtype = np.uint16
>>> arr
array([65535], dtype=uint16)
如您所见,结果是单个数字65535.如果没有响起,它就是2 ** 16-1,⼆进制格式中有16个数字.这两个全⼀模式被重新解释为单个16位数字,结果也相应更改.您经常看到怪异数字的原因是,将浮点数重新解释为int,反之亦然,这将导致数据处理更强⼤,这是由于内存中浮点数的表⽰⽅式所致.
作为hpaulj noted,您可以通过使⽤修改后的dtype构造新的数组view来直接执⾏数据的重新解释.这可能⽐必须重新分配给定数组的dtype更为有⽤,但是再次更改dtype仅在相当罕见的⾮常特殊的⽤例中有⽤.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论