Skip to content

第 2 章 创建数组

学习目标

  • 会用 np.array 从列表创建数组,并指定 dtype
  • 掌握规则形状的创建:zerosonesfulleye
  • 掌握等差序列:arangelinspace
  • 认识常用的 dtype 类型
  • 会用 reshape 初步改变形状

2.1 从列表创建:np.array

np.array(列表) 把 Python 列表转成数组。这是最直接的创建方式,适合数据已知、规模不大的情况:

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,强制转换类型:

python
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

注意 floatint截断而不是四舍五入: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)。

python
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.]]

三个要点:

  1. zeros/ones 默认创建浮点数组(打印为 0.1.),可用 dtype=int 改为整数。
  2. 形状参数可以是整数或元组:np.zeros(4) 是一维长度 4;np.zeros((2, 3)) 是二维 2 行 3 列。元组形状要带圆括号。
  3. eye(n) 只接受一个整数 n,生成 n×n 方阵。

2.3 等差序列:arange、linspace

np.arange(起始, 结束, 步长):按固定步长生成整数或浮点序列,结束 不包含。

np.linspace(起始, 结束, 个数):在区间内生成等间距的 n 个数,结束 包含(默认)。

python
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含义示例创建
int6464 位整数np.array([1, 2], dtype=np.int64)
float6464 位浮点(默认浮点)np.array([1.5], dtype=np.float64)
bool布尔(True/False)np.array([True, False])
str / <U…字符串np.array(["a"])

日常使用记住两点:

  1. 不带 dtype 参数时,NumPy 自动推断:整数列表 → int64,带小数 → float64,字符串 → 字符串类型。
  2. 显式指定用 dtype=np.float32 这类写法;dtype=floatdtype=int 这种简写也合法。

2.5 reshape:改变形状

reshape(新形状) 在元素个数不变的前提下,把数组重新排列成新形状。元素总数必须一致:12 个元素可以变成 (3, 4)(4, 3)(2, 6)(12, 1),但不能变成 (5, ?)(5 不能整除 12)。

python
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 个月:

python
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 章展开,本章先会用基本形式。

动手实践

  1. 创建 5×5 的单位矩阵,验证对角线是 1、其余是 0。
  2. np.zeros 创建 2 行 4 列整数数组,打印 dtype 确认是整数。
  3. linspace 生成 20 个 0 到 2π 的等距点(提示:np.pi),打印前 3 个和后 3 个元素。
  4. 创建数组 [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得到包含 1linspace 默认包含结束值;可用 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)

章末练习

基础

  1. np.full 创建一个 3×4、全部为 8 的数组,打印并验证形状。
  2. np.arange 生成从 5 到 50(不含 50)、步长 5 的数组。
  3. np.linspace 生成 0 到 1 之间的 11 个等距点,验证首尾分别是 0 和 1。

提高

  1. 创建 3×3 单位矩阵,再把所有 1 改成 2(提示:直接对数组加 1,再打印,观察哪些元素变了)。
  2. np.zeros 创建 5×5 整数数组,把中间一行全部设为 5(提示:先想清楚下标,下一章讲索引;本题可以先查资料)。

挑战

  1. 写出 np.arange(0, 1, 0.2) 的输出,再运行验证;思考为什么浮点步长的 arange 容易出问题(提示:0.2 在二进制里不是精确值)。
  2. np.linspace 生成 100 个 0 到 1 的点,用 reshape 排成 10×10,打印,并说明 reshape 的填充顺序。

章末自测

每题选择一个最佳答案。本书不附答案:完成后交由老师或 AI 老师批改讲解。

  1. np.zeros((2, 3)) 创建的是?
    • A. 2 个元素的数组
    • B. 2 行 3 列的数组
    • C. 3 行 2 列的数组
    • D. 报错
  2. np.zeros(3) 的默认 dtype 是?
    • A. int64
    • B. float64
    • C. bool
    • D. str
  3. np.arange(1, 10, 3) 的结果是?
    • A. [1, 4, 7, 10]
    • B. [1, 4, 7]
    • C. [1, 4, 7, 9]
    • D. [1, 3, 5]
  4. 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]
  5. np.full(4, 9) 的结果是?
    • A. [9, 9, 9, 9]
    • B. [4, 4, 4, 4]
    • C. 报错
    • D. [9]
  6. np.eye(3) 的中间那个元素(第 2 行第 2 列)是?
    • A. 0
    • B. 1
    • C. 3
    • D. 未定义
  7. np.array([1.9, 2.9], dtype=int) 的结果是?
    • A. [2, 3]
    • B. [1, 2]
    • C. [1.9, 2.9]
    • D. 报错
  8. np.arange(12).reshape(3, 4) 的最后一个元素是?
    • A. 10
    • B. 11
    • C. 12
    • D. 9
  9. 下列哪个函数用于生成「0 到 100 之间恰好 50 个等距点」?
    • A. np.arange(0, 100, 50)
    • B. np.linspace(0, 100, 50)
    • C. np.full(50, 100)
    • D. np.ones(50)
  10. np.array([1, 2, 3], dtype=float) 的 dtype 是?
    • A. int64
    • B. float64
    • C. str
    • D. bool