
2.1.2 元素类型
数组的元素类型可以通过dtype属性获得。在前面的例子中,创建数组所用的序列的元素都是整数,因此所创建的数组的元素类型是整型,并且是32位的长整型。这是因为笔者所使用的Python是32位的,如果使用64位的操作系统和Python,那么默认整数类型的长度为64位。
c.dtype dtype('int32')
可以通过dtype参数在创建数组时指定元素类型,注意float类型是64位的双精度浮点类型,而complex是128位的双精度复数类型:

在上面的例子中,传递给dtype参数的都是类型(type)对象,其中float和complex为Python内置的浮点数类型和复数类型,而np.int32是NumPy定义的新的数据类型—— 32位符号整数类型。
NumPy也有自己的浮点数类型:float16、float32、float64和float128。当使用float64作为dtype参数时,其效果和内置的float类型相同。
在需要指定dtype参数时,也可以传递一个字符串来表示元素的数值类型。NumPy中的每个数值类型都有几种字符串表示方式,字符串和类型之间的对应关系都存储在typeDict字典中。下面的程序获得与float64类型对应的所有键值:
[key for key, value in np.typeDict.items() if value is np.float64] [12, 'd', 'float64', 'float_', 'float', 'f8', 'double', 'Float64']
完整的类型列表可以通过下面的语句得到,它将typeDict字典中所有的值转换为一个集合,从而去除其中的重复项:

上面显示的数值类型与数组的dtype属性是不同的对象。通过dtype对象的type属性可以获得与其对应的数值类型:
c.dtype.type numpy.int32
通过NumPy的数值类型也可以创建数值对象,下面创建一个16位的符号整数对象,它与Python的整数对象不同的是,它的取值范围有限,因此计算200*200会溢出,得到一个负数,这一点与C语言的16位整数的结果相同:
a = np.int16(200) a*a -25536
另外值得注意的是,NumPy的数值对象的运算速度比Python的内置类型的运算速度慢很多,如果程序中需要大量地对单个数值运算,应当尽量避免使用NumPy的数值对象。下面比较了Python内置的float类型与NumPy的双精度浮点数值float64的乘法运算的速度:
v1 = 3.14 v2 = np.float64(v1) %timeit v1*v1 %timeit v2*v2 10000000 loops, best of 3: 70.1 ns per loop 10000000 loops, best of 3: 178 ns per loop
使用astype()方法可以对数组的元素类型进行转换,下面将浮点数数组t1转换为32位整数数组,将双精度的复数数组t2转换成单精度的复数数组:
t1 = np.array([1, 2, 3, 4], dtype=np.float) t2 = np.array([1, 2, 3, 4], dtype=np.complex) t3 = t1.astype(np.int32) t4 = t2.astype(np.complex64)