# 3.1.2 NumPy数组属性

NumPy数组（ndarray）是进行科学计算时最基本的数据结构。它不但保存数值本身，还带有一组用来描述数组结构的常用属性。课程表3-1给出的常用属性包括：ndim（数组的维数）、size（数组中元素的总个数）、shape（由各维长度组成的元组）、dtype（数组元素的数据类型）以及T（数组的转置）。先读懂这些属性，再去做索引、切片、广播和函数运算，才不容易把轴方向弄错。

查看属性时，在数组对象后面直接写属性名即可，不必加括号。典型写法是先创建再观察：

```python
import numpy as np
a = np.arange(8).reshape(2, 4)
print(a.ndim)
print(a.size)
print(a.shape)
print(a.T)
```

执行后得到2行4列的二维数组：`a.ndim`为2，说明有两条轴；`a.size`为8，等于各维长度的乘积；`a.shape`为`(2, 4)`。`a.dtype`表示元素类型，课程示例输出为`dtype('int32')`；如果创建时不指定dtype，将由系统自动确定。二维数组的转置`a.T`会交换轴0与轴1，形状变为`(4, 2)`，元素按列重新排列，结果为`array([[0, 4], [1, 5], [2, 6], [3, 7]])`。

要把属性与“数组的轴”对应起来。一维数组只有一条轴，称为轴0，沿着数组的长度方向操作；二维数组有轴0和轴1，轴0沿着行的方向，轴1沿着列的方向。ndim等于轴的条数，shape元组从左到右依次对应各轴长度。`reshape()`可以改变shape和ndim，但不能改变size，因为元素总数必须保持不变。若`reshape`时某一维写成`-1`，NumPy会按元素总数自动推断该维长度。

使用中有三个易错点。第一，一维数组的转置还是一维数组：对`np.arange(4)`取`.T`，结果仍是`array([0, 1, 2, 3])`，形状不会变成`(4, 1)`或`(1, 4)`。第二，dtype描述的是元素的数据类型，不是数组对象本身的类型；创建时可用dtype参数指定。第三，shape的结果是元组而不是列表，应写成`(2, 4)`而不是`[2, 4]`。另外，切片得到的视图与原数组共享数据，但它们仍是独立对象，各自拥有自己的维数、形状和大小等属性。

## 关键要点
- 常用属性包括ndim、size、shape、dtype和T
- ndim是维数，size是元素个数，shape是各维长度组成的元组，dtype是元素的数据类型
- 二维数组的T交换轴0与轴1（行与列）；一维数组的转置还是一维数组
- 创建时若不指定dtype，将由系统自动确定数据类型
- reshape可以改变shape和ndim，但不能改变size
- 切片得到的视图与原数组共享数据，但各自拥有独立的ndim、shape、size等属性
