# 3.2.2 NumPy数据类型转换

NumPy数据类型转换是指把数组中每个元素从一种数据类型改成另一种数据类型。课程使用数组对象的`astype()`方法完成这项工作：`astype()`用于将数组的元素类型转换为指定的类型，并返回一个新的数组，而不改变原数组。`astype()`方法可以将数组从一种数据类型转换为另一种，例如把整数类型`int32`转为`int16`，或把浮点数类型`float64`转为`float32`。创建数组时若不指定数据类型，将由系统自动确定；对已经创建好的数组改变类型时，则调用`astype()`并写明目标类型。

常用API写法为`新数组 = 原数组.astype(目标类型)`。目标类型写成`np.int16`、`np.float32`等形式。查看当前类型使用数组的`dtype`属性。需要注意：创建阶段也可以用参数`dtype`直接指定类型，例如`np.arange(6, dtype=np.int16)`，那是在创建时确定类型；本节的`astype()`则是在数组已经存在之后再转换，两者不要混用。课程给出两组演示：先用`np.arange(6)`得到默认整数数组，再用`astype(np.int16)`得到新数组；再用`np.random.rand(4)`得到默认`float64`数组，并用`astype(np.float32)`转换。

```python
import numpy as np
a = np.arange(6)
print(a.dtype)
b = a.astype(np.int16)
print(b.dtype)
print(a.dtype)
c = np.random.rand(4)
print(c.dtype)
d = c.astype(np.float32)
print(d.dtype)
```

课程示例中，`a.dtype`为`dtype('int32')`，`b.dtype`为`dtype('int16')`；`c.dtype`为`dtype('float64')`，`d.dtype`为`dtype('float32')`。再次打印`a.dtype`仍是原来的类型，说明`astype()`创建了新数组，并没有改写原数组`a`。

使用时有两个易错点。第一，不要把`astype()`理解成原地修改：必须用返回值接收新数组，原数组的`dtype`保持不变；只写`a.astype(np.int16)`而不赋值，原数组类型不会变。第二，当从高精度类型转换为低精度类型时（如`float64`转`int32`），可能会丢失数据的精度，需要慎重对待。浮点数转整数会截去小数部分；整数位宽变窄时，超出目标类型表示范围的值还可能溢出。转换前应先查看`dtype`，再选择合适的目标类型。

## 关键要点
- `astype()`用于将数组的元素类型转换为指定的类型，并返回一个新的数组
- `astype()`不改变原数组，必须用返回值接收转换结果
- 创建时不指定`dtype`则由系统自动确定；转换时需给出`np.int16`、`np.float32`等目标类型
- 创建时用`dtype`参数指定类型，与创建后再用`astype()`转换，是两个不同步骤
- `np.arange(6)`课程示例为`int32`，可转为`int16`；`np.random.rand(4)`为`float64`，可转为`float32`
- 从高精度转到低精度（如`float64`转`int32`）可能丢失精度，需慎重对待
