我们知道Python中有4种数值类型,分别是int、float、bool和complex。作为面向科学计算的NumPy,其数据类型更为丰富。今天我将详细解释NumPy中的数据类型。数组中的数据类型NumPy是用C语言实现的。我们可以将NumPy中数组中的数据类型与C语言中的数据类型进行比较:definednp.shortshortPlatform-definednp.ushortunsignedshortPlatform-definednp.intcintPlatform-definednp.uintcunsignedintPlatform-definednp.int_longPlatform-definednp.uintunsignedlongPlatform-definednp.longlonglonglongPlatform-definednp.ulonglongunsignedlonglongPlatform-definednp.half/np.float16Halfprecisionsignfloat:位,5位指数,10位mantissanp.singlefloat平台定义的单精度浮点数:通常是符号位,8位指数,23位mantissanp。通常为符号位,11位指数,52位mantissa.np.longdoublelongdoublePlatform-definedextended-precisionfloatnp.csinglefloatcomplexComplex,由两个单精度浮点数(实部和虚部)表示np.cddoubledoublecomplexComplex数,由两个双精度浮点数(实部和虚部)表示。np.clongdoublelongdoublecomplexComplex数,由两个扩展精度浮点数(实部和虚部)表示。我们在Ipython环境中随机查看以上类型到底是什么:importnumpyasnpIn[26]:np.byteOut[26]:numpy.int8In[27]:np.bool_Out[27]:numpy.bool_In[28]:np.ubyteOut[28]:numpy.uint8In[29]:np.shortOut[29]:numpy.int16In[30]:np.ushortOut[30]:numpy.uint16所以上面的数据类型,它的底层还是固定的-length数据类型,让我们看看有什么:9223372036854775807)np.uint8uint8_tUnsignedinteger(0to255)np.uint16uint16_tUnsignedinteger(0to65535)np.uint32uint32_tUnsignedinteger(0to4294967295)np.uint64uint64_tUnsignedinteger(0to18446744073709551615)np.intpintptr_tInteindexingused,for他与ssize_tnp.uintpuintptr_tInteger相同,大到足以容纳一个指针np.float32floatnp.float64/np.float_double)np.complex128/np.complex_doublecomplex请注意,这与内置python复合体的精度相匹配。所有这些类型都是dtype对象的实例。常用的基本类型有5种,分别是bool、int、uint、float和complex。类型后面的数字表示该类型占用的字节数。上表中有一些平台定义的数据类型。这些类型与平台有关,使用时要特别注意。这些dtype类型可以在创建数组时手动指定:>>>importnumpyasnp>>>x=np.float32(1.0)>>>x1.0>>>y=np.int_([1,2,4])>>>yarray([1,2,4])>>>z=np.arange(3,dtype=np.uint8)>>>zarray([0,1,2],dtype=uint8)由于历史原因和向后兼容,我们还可以在创建数组时指定字符格式的dtype。>>>np.array([1,2,3],dtype='f')array([1.,2.,3.],dtype=float32)上面的f代表float类型。类型转换如果想转换一个已有的数组类型,可以使用数组自带的astype方法,也可以调用np的强制转换方法:In[33]:z=np.arange(3,dtype=np.uint8)In[34]:zOut[34]:array([0,1,2],dtype=uint8)In[35]:z.astype(float)Out[35]:array([0.,1.,2.])In[36]:np.int8(z)Out[36]:array([0,1,2],dtype=int8)注意上面我们使用了float,Python会自动将float替换为np.float_,同样的简化格式还有int==np.int_,bool==np.bool_,complex==np.complex_。其他数据类型不能使用简化版。查看类型要查看数组的数据类型,可以使用内置的dtype属性:In[37]:z.dtypeOut[37]:dtype('uint8')作为一个对象,dtype也可以执行一些类型判断操作:>>>d=np.dtype(int)>>>ddtype('int32')>>>np.issubdtype(d,np.integer)True>>>np.issubdtype(d,np.floating)假数据溢出一般来表示,如果超出了数据的范围,就会报异常。比如我们有一个非常长的int值:In[38]:a=1000000000000000000000000000000000000000000000000000000000000000000000000000000In[39]:aOut[39]:1000000000000000000000000000000000000000000000000000000000000000000000000000000In[40]:np.int(1000000000000000000000000000000000000000000000000000000)Out[40]:1000000000000000000000000000000000000000000000000000000In[41]:np.int32(10000000000000000000000000000000000000000000000000000000)---------------------------------------------------------------------------OverflowErrorTraceback(最近调用最后)
