# 3.2.1 NumPy数据类型概述

## 3.2.1 NumPy数据类型概述

NumPy数组（ndarray）是存放同类型数据的核心对象，同一个数组中的每一个元素都属于同一种数据类型，该类型由属性dtype记录。在3.1.2节中，dtype已作为数组常用属性出现；本节进一步说明NumPy支持哪些数据类型，以及创建数组时如何查看和指定。课程列出的常用数据类型有四类：整数类型（int8、int16、int32、int64）、无符号整数类型（uint8、uint16、uint32、uint64）、浮点数类型（float16、float32、float64）以及复数类型（complex64）。类型名中的数字表示每个元素占用的比特数，例如int32每个整数占32位，float64每个浮点数占64位。位宽越大，可表示的数值范围或精度越高，占用的内存也越多。

如果创建数组时不指定数据类型，将由系统自动确定。例如用`np.arange(6)`创建整数序列，课程示例中`a.dtype`为`dtype('int32')`；用`np.random.rand(3)`生成`[0,1)`均匀分布的随机数，`b.dtype`为`dtype('float64')`。也可以通过参数`dtype`在创建时指定类型：`np.arange(6, dtype=np.int16)`得到int16数组；`np.array([1.1, 2.3, 3.4], dtype=np.float32)`得到float32数组。查看类型时写成数组对象`.dtype`，不必加括号。

```python
import numpy as np
a = np.arange(6)
print(a.dtype)
b = np.random.rand(3)
print(b.dtype)
c = np.arange(6, dtype=np.int16)
print(c.dtype)
d = np.array([1.1, 2.3, 3.4], dtype=np.float32)
print(d.dtype)
```

使用中要注意三点。第一，dtype描述的是元素的数据类型，不是数组对象本身的Python类型，后者要用`type(数组)`查看。第二，未指定dtype时由系统自动确定，同一段代码在不同运行环境可能得到int32或int64，课程按int32讲解；若输入数据中出现小数，系统通常会把整个数组定为浮点类型。第三，创建时用dtype参数指定类型，与下一节的`astype()`转换不是同一回事：`astype()`返回新数组、不改变原数组；从高精度转到低精度（如float64转int32）可能丢失精度，需要慎重。选择类型时，整数序列多用int，随机小数和一般科学计算多用float64，内存紧张或数据范围明确时可改用int16、float32等更窄的类型。

## 关键要点
- 同一数组的元素类型相同，由属性dtype记录
- 常用类型包括整数int8/16/32/64、无符号整数uint8/16/32/64、浮点数float16/32/64、复数complex64
- 创建时若不指定dtype，将由系统自动确定；arange常为整数，rand常为float64
- 可通过参数dtype指定，如dtype=np.int16、dtype=np.float32
- 查看类型用数组.dtype，不要加括号；dtype说的是元素类型而不是数组对象本身的类型
- 创建时指定dtype与astype()转换不同；高精度改低精度可能丢失数据
