第 2 章 创建数组
学习目标
- 会用
np.array从列表创建数组,并指定dtype - 掌握规则形状的创建:
zeros、ones、full、eye - 掌握等差序列:
arange、linspace - 认识常用的
dtype类型 - 会用
reshape初步改变形状
2.1 从列表创建:np.array
np.array(列表) 把 Python 列表转成数组。这是最直接的创建方式,适合数据已知、规模不大的情况:
import numpy as np
names = np.array(["张三", "李四", "王五"]) # 字符串数组
heights = np.array([1.72, 1.65, 1.80]) # 浮点数组
print(names.dtype)
print(heights.dtype)输出:
<U3
float64<U3 是 NumPy 对「最多 3 个字符的 Unicode 字符串」的缩写,细节不重要,记住:字符串数组有字符串类型即可。
array 的第二个参数可以指定 dtype,强制转换类型:
import numpy as np
a = np.array([1, 2, 3], dtype=float) # 整数转浮点
b = np.array([1.9, 2.9], dtype=int) # 浮点转整数(截断小数)
print(a, a.dtype)
print(b, b.dtype)输出:
[1. 2. 3.] float64
[1 2] int64注意 float 转 int 是截断而不是四舍五入:1.9 变 1。需要四舍五入用 np.round(第 4 章)。
2.2 规则形状:zeros、ones、full、eye
有些数组的形状是「规则」的——全 0、全 1、全同一个数、单位矩阵。这些不必手工列元素,有专门的函数。
np.zeros(形状):全部为 0 的数组。
np.ones(形状):全部为 1 的数组。
np.full(形状, 填充值):全部为同一个指定值的数组。
np.eye(n):n×n 单位矩阵(对角线为 1,其余为 0)。
import numpy as np
print(np.zeros(4)) # 一维,4 个 0
print(np.zeros((2, 3))) # 二维,2 行 3 列
print(np.ones((2, 2))) # 2×2 全 1
print(np.full(3, 7)) # 一维,3 个 7
print(np.full((2, 3), 1.5)) # 2 行 3 列全 1.5
print(np.eye(3)) # 3×3 单位矩阵输出:
[0. 0. 0. 0.]
[[0. 0. 0.]
[0. 0. 0.]]
[[1. 1.]
[1. 1.]]
[7 7 7]
[[1.5 1.5 1.5]
[1.5 1.5 1.5]]
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]三个要点:
zeros/ones默认创建浮点数组(打印为0.、1.),可用dtype=int改为整数。- 形状参数可以是整数或元组:
np.zeros(4)是一维长度 4;np.zeros((2, 3))是二维 2 行 3 列。元组形状要带圆括号。 eye(n)只接受一个整数 n,生成 n×n 方阵。
2.3 等差序列:arange、linspace
np.arange(起始, 结束, 步长):按固定步长生成整数或浮点序列,结束 不包含。
np.linspace(起始, 结束, 个数):在区间内生成等间距的 n 个数,结束 包含(默认)。
import numpy as np
print(np.arange(10)) # 0 到 9
print(np.arange(2, 10, 2)) # 2 开始,步长 2,到 10 前为止
print(np.arange(1, 11)) # 1 到 10
print(np.linspace(0, 1, 5)) # 0 到 1 之间取 5 个等距点
print(np.linspace(1, 100, 4)) # 1 到 100 之间取 4 个点输出:
[0 1 2 3 4 5 6 7 8 9]
[2 4 6 8]
[ 1 2 3 4 5 6 7 8 9 10]
[0. 0.25 0.5 0.75 1. ]
[ 1. 34. 67. 100.]区别一句话:arange 指定步长,linspace 指定个数。
- 要「0 到 100 每 2 一个」,用
np.arange(0, 101, 2)。 - 要「0 到 100 恰好 50 个点」,用
np.linspace(0, 100, 50)。
arange 的步长也可以是浮点数,但浮点累计误差可能导致元素个数意外多一个或少一个;需要精确个数时优先用 linspace。
2.4 常用 dtype 一览
dtype 决定元素的类型与存储精度。常用类型:
| dtype | 含义 | 示例创建 |
|---|---|---|
int64 | 64 位整数 | np.array([1, 2], dtype=np.int64) |
float64 | 64 位浮点(默认浮点) | np.array([1.5], dtype=np.float64) |
bool | 布尔(True/False) | np.array([True, False]) |
str / <U… | 字符串 | np.array(["a"]) |
日常使用记住两点:
- 不带
dtype参数时,NumPy 自动推断:整数列表 →int64,带小数 →float64,字符串 → 字符串类型。 - 显式指定用
dtype=np.float32这类写法;dtype=float、dtype=int这种简写也合法。
2.5 reshape:改变形状
reshape(新形状) 在元素个数不变的前提下,把数组重新排列成新形状。元素总数必须一致:12 个元素可以变成 (3, 4)、(4, 3)、(2, 6)、(12, 1),但不能变成 (5, ?)(5 不能整除 12)。
import numpy as np
a = np.arange(12) # 0 到 11,共 12 个
print(a.reshape(3, 4)) # 变成 3 行 4 列输出:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]注意阅读顺序:reshape 把原数组按「行优先」顺序填入——先填满第一行,再第二行,以此类推。
一个实用场景:把 12 个月的销量数据排成 4 个季度 × 3 个月:
import numpy as np
sales = np.arange(1, 13) # 12 个月销量
quarterly = sales.reshape(4, 3) # 4 行 × 3 列
print(quarterly)输出:
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]reshape 的详细规则(包括 -1 自动推断)在第 5 章展开,本章先会用基本形式。
动手实践
- 创建 5×5 的单位矩阵,验证对角线是 1、其余是 0。
- 用
np.zeros创建 2 行 4 列整数数组,打印dtype确认是整数。 - 用
linspace生成 20 个 0 到 2π 的等距点(提示:np.pi),打印前 3 个和后 3 个元素。 - 创建数组
[1, 2, 3, 4, 5, 6]并 reshape 成 2 行 3 列,打印;再尝试 reshape 成 4 行 3 列,观察报错并解释原因。
常见错误
| 错误写法 | 现象 | 原因 |
|---|---|---|
np.zeros((3), dtype=int) 误写成 np.zeros(3, dtype=int) | 形状写错 | 形状是整数时可直接写 3;多个维度才需要元组 |
np.arange(1, 10, 2) 想要 1,3,5,7,9 | 得到 [1 3 5 7 9] | 正确;注意 arange 不含结束值,10 不会被包含 |
np.linspace(0, 1, 5) 期望不含 1 | 得到包含 1 | linspace 默认包含结束值;可用 endpoint=False 排除 |
np.array([1, 2, 3], dtype=int) 把 1.9 转 int | 得到 1 | 浮点转整数是截断,不是四舍五入 |
a.reshape(5, 3)(12 个元素) | ValueError: cannot reshape array of size 12 into shape (5,3) | 元素总数 12 ≠ 5×3=15,必须一致 |
np.eye(2, 3) | 报错或行为不符预期 | eye 用于方阵;非方阵用 np.eye(2, 3) 也可以,但入门先记住 eye(n) |
章末练习
基础
- 用
np.full创建一个 3×4、全部为 8 的数组,打印并验证形状。 - 用
np.arange生成从 5 到 50(不含 50)、步长 5 的数组。 - 用
np.linspace生成 0 到 1 之间的 11 个等距点,验证首尾分别是 0 和 1。
提高
- 创建 3×3 单位矩阵,再把所有 1 改成 2(提示:直接对数组加 1,再打印,观察哪些元素变了)。
- 用
np.zeros创建 5×5 整数数组,把中间一行全部设为 5(提示:先想清楚下标,下一章讲索引;本题可以先查资料)。
挑战
- 写出
np.arange(0, 1, 0.2)的输出,再运行验证;思考为什么浮点步长的arange容易出问题(提示:0.2 在二进制里不是精确值)。 - 用
np.linspace生成 100 个 0 到 1 的点,用reshape排成 10×10,打印,并说明 reshape 的填充顺序。
章末自测
每题选择一个最佳答案。本书不附答案:完成后交由老师或 AI 老师批改讲解。
np.zeros((2, 3))创建的是?- A. 2 个元素的数组
- B. 2 行 3 列的数组
- C. 3 行 2 列的数组
- D. 报错
np.zeros(3)的默认 dtype 是?- A.
int64 - B.
float64 - C.
bool - D.
str
- A.
np.arange(1, 10, 3)的结果是?- A.
[1, 4, 7, 10] - B.
[1, 4, 7] - C.
[1, 4, 7, 9] - D.
[1, 3, 5]
- A.
np.linspace(0, 10, 5)的结果是?- A.
[0, 2.5, 5, 7.5, 10] - B.
[0, 10] - C.
[0, 2, 4, 6, 8] - D.
[0, 1, 2, 3, 4]
- A.
np.full(4, 9)的结果是?- A.
[9, 9, 9, 9] - B.
[4, 4, 4, 4] - C. 报错
- D.
[9]
- A.
np.eye(3)的中间那个元素(第 2 行第 2 列)是?- A.
0 - B.
1 - C.
3 - D. 未定义
- A.
np.array([1.9, 2.9], dtype=int)的结果是?- A.
[2, 3] - B.
[1, 2] - C.
[1.9, 2.9] - D. 报错
- A.
np.arange(12).reshape(3, 4)的最后一个元素是?- A.
10 - B.
11 - C.
12 - D.
9
- A.
- 下列哪个函数用于生成「0 到 100 之间恰好 50 个等距点」?
- A.
np.arange(0, 100, 50) - B.
np.linspace(0, 100, 50) - C.
np.full(50, 100) - D.
np.ones(50)
- A.
np.array([1, 2, 3], dtype=float)的 dtype 是?- A.
int64 - B.
float64 - C.
str - D.
bool
- A.
