Python的易用之处在于动态输入,每个变量的数据类型是动态推断的,而C语言的是被明确地声明。
Python的数据类型其实是一个Python对象,每一个Python对象都是一个聪明的伪C语言结构体,该结构体不仅包含值,也包含其它信息。在定义一个Python对象时,其实是定义一个指针,指向包含这个Python对象的所有信息的某个内存位置,由于Python对象的整个数据类型结构体里面还包含大量额外的信息,相对C语言来说这些信息会增加额外的负担。
Numpy的数组与Python列表差异:
- Python列表每一个元素都是完整的结构体,包含数据和类型信息;比较灵活,可用任意类型填充。
- Numpy数组是固定类型的,要求数组内必须包含同一类型的数据,如果类型不匹配,Numpy将会向上转换(如果可行),如整型可以转换成浮点型;缺乏灵活性,但是可更有效存储和操作数据。
Numpy基本数据类型表
名称 | 描述 |
---|---|
bool_ | 布尔型数据类型(True 或者 False) |
int_ | 默认的整数类型(类似于 C 语言中的 long,一般是int 32 或 int64) |
intc | 与 C 的 int 类型一样,一般是 int32 或 int 64 |
intp | 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64) |
int8 | 字节(-128 to 127) |
int16 | 整数(-32768 to 32767) |
int32 | 整数(-2147483648 to 2147483647) |
int64 | 整数(-9223372036854775808 to 9223372036854775807) |
uint8 | 无符号整数(0 to 255) |
uint16 | 无符号整数(0 to 65535) |
uint32 | 无符号整数(0 to 4294967295) |
uint64 | 无符号整数(0 to 18446744073709551615) |
float_ | float64 类型的简写 |
float16 | 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位 |
float32 | 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位 |
float64 | 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位 |
complex_ | complex128 类型的简写,即 128 位复数 |
complex64 | 复数,表示双 32 位浮点数(实数部分和虚数部分) |
complex128 | 复数,表示双 64 位浮点数(实数部分和虚数部分) |
#获取数组数据类型
In [11]: arr = np.array([1,2,3,4])
In [12]: arr.dtype
Out[12]: dtype('int32')
#转换数组数据类型
In [13]: float_arr = arr.astype(np.float64)
In [14]: float_arr.dtype
Out[14]: dtype('float64')
#转换数组与另一个数组一样的数据类型
In [15]: arr2 = np.array([2.22,3.33,-1.2])
In [17]: float_arr2 = arr.astype(arr2.dtype)
In [18]: float_arr2
Out[18]: array([1., 2., 3., 4.])
In [19]: float_arr2.dtype
Out[19]: dtype('float64')
#创建结构化数据类型
In [2]: a = np.array([1,2,3],dtype = complex)
In [3]: a
Out[3]: array([1.+0.j, 2.+0.j, 3.+0.j])
In [4]: dt = np.dtype([('age',np.int8)])
In [5]: dt
Out[5]: dtype([('age', 'i1')])
In [6]: a = np.array([(10,),(20,),(30,)],dtype = dt)
In [7]: a
Out[7]: array([(10,), (20,), (30,)], dtype=[('age', 'i1')])
In [8]: a['age']
Out[8]: array([10, 20, 30], dtype=int8)