我是新的编程和numpy。。。在阅读教程和在jupyter笔记本上做实验时。。。我考虑如下转换numpy数组的数据类型:
import numpy as np
c = np.random.rand(4)*10
print c
#Output1: [ 0.12757225 5.48992242 7.63139022 2.92746857]
c.dtype = int
print c
#Output2: [4593764294844833304 4617867121563982285 4620278199966380988 4613774491979221856]
我知道改变的正确方法是:
^{pr2}$但我想知道Output2中那些模糊数字背后的原因。它们是什么?它们意味着什么?在
浮点和整数(
numpy.float64
s和numpy.int64
s)在内存中的表示方式不同。存储在这些不同类型中的值42对应于存储器中的不同比特模式。在当您重新分配数组的
dtype
属性时,您将保持底层数据不变,并告诉numpy以新的方式解释该位模式。因为现在的解释与数据的原始定义不匹配,所以最终会产生胡言乱语(无意义的数字)。在另一方面,通过
.astype()
转换数组实际上会转换内存中的数据:正确转换:
^{pr2}$如您所见,使用
astype
将有意义地转换数组的原始值,在本例中,它将截断为整数部分,并返回一个新数组,其中包含相应的值和dtype
。在注意,分配一个新的
dtype
不会触发任何检查,因此可以对数组执行非常奇怪的操作。在上面的示例中,64位浮点被重新解释为64位整数。但也可以更改位大小:通过告诉numpy您的数据占用了原来一半的空间,numpy将推断您的数组有两倍多的元素!显然不是你想做的。在
另一个例子:考虑8位无符号整数255==2**8-1:它对应于二进制中的11111111。现在,尝试将其中两个数字重新解释为单个16位无符号整数:
如您所见,结果是单数65535。如果这还不算什么,那就是2**16-1,在二进制模式中有16个1。两个完整的1模式被重新解释为一个16位数字,结果也相应地改变了。您经常看到更奇怪的数字的原因是,由于浮点数在内存中的表示方式,将浮点数重新解释为int(反之亦然)将导致更严重的数据混乱。在
作为hpaulj noted,您可以通过使用修改后的} ,直接执行对数据的这种重新解释。这可能比必须重新分配给定数组的
dtype
构造一个新的数组^{dtype
更有用,但是再次更改dtype
只在非常罕见、非常特定的用例中有用。在相关问题 更多 >
编程相关推荐