简介
本文将介绍NumPy中的数据类型,不同的数据类型有自己特定的场合。比如图片生成矩阵或者矩阵生成图片,要求必须是uint8
数据类型。除此之外,掌握数据类型之间的转换也很重要。
数据类型
在NumPy中定义了如下的数据类型:
类型 | 类型代码 | 描述 |
---|---|---|
int8、uint8 | i1、u1 | 有符号和无符号的8位整型(1个字节) |
int16、uint16 | i2、u2 | 有符号和无符号的16位整型(2个字节) |
int32、uint32 | i4、u4 | 有符号和无符号的32位整型(4个字节) |
int64、uint64 | i8、u8 | 有符号和无符号的64位整型(8个字节) |
float16 | f2 | 半精度浮点数 |
float32 | f4或f | 标准的单精度浮点数 |
float64 | f8或d | 标准的双精度浮点数 |
float128 | f16或g | 扩展精度浮点数 |
complex64、complex128 | c8、c16 | 分别用两个32位、64位或128位浮点数表示的复数 |
complex256 | c32 | 复数 |
bool | ? | True和False布尔类型 |
object | O | Python对象类型 |
string_ | S | 固定长度的字符串类型。例如,创建一个长度为10的字符串,应使用S10 |
unicode_ | U | 固定长度的Unicode类型,跟字符串定义方式一样,比如U10 |
在这些类型当中,需要注意一点。有符号数据类型可以包括负数。无符号数据必须大于等于0。比如int8
的取值范围是(-128,127)
,而uint8
的取值范围是(0,255)
。图片当中每个像素点的取值都是在(0,255)
之间,在以后的图片处理过程要特别注意这个小知识点。
首先通过array()
函数创建ndarray数组:
1 2 3 |
>>>a = np.array([5, 2, 0]) >>>a.dtype dtype('int32') |
可以看到默认的是int32
类型,除此之外,还可以指定数据类型:
1 2 3 4 5 6 |
>>>b = np.array([5, 2, 0], dtype='int8') >>>b.dtype dtype('int8') >>>c = np.array([5, 2, 0], dtype='float16') >>>c.dtype dtype('float16') |
还可以通过astype
方法显式地转换数据类型:
1 2 3 4 5 |
>>>d = c.astype(np.float64) >>>d array([5., 2., 0.]) >>>d.dtype dtype('float64') |
除了使用数据类型表示,还可以使用表中的类型代码来表示:
1 2 3 4 5 |
>>>e = np.array([1, 3, 5], dtype='u1') >>>e array([1, 3, 5], dtype=uint8) >>>e.dtype dtype('uint8') |
数组与标量的运算
在NumPy中能够很方便地实现数组的运算。大小相等的数组之间的运算可以应用到里面的每个元素中。
代码演示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
>>>import numpy as np >>>a = np.array([[1, 2], [3, 4]]) >>>a array([[1, 2], [3, 4]]) >>>b = np.ones((2, 2)) >>>b array([[1., 1.], [1., 1.]]) >>>a - b array([[0., 1.], [2., 3.]]) >>>a * a array([[ 1, 4], [ 9, 16]]) |
当然数组和标量之间也能进行运算。
代码演示:
1 2 3 4 5 6 7 |
>>>a - 1 array([[0, 1], [2, 3]]) >>>a * 2 array([[2, 4], [6, 8]]) |
除此之外,不同大小数组之间的运算叫做广播,在后面的内容中会讲到。
总结
在本文中介绍了NumPy的数据类型,在以后的使用中要学会通过astype
方法灵活地转换数据类型;熟练掌握数组和标量之间的运算。