Python NumPy 入门教程:从数组创建到广播运算,快速掌握高效数值计算

很多人在学完 Python 基础语法之后,都会碰到一个非常现实的问题:如果我要处理大量数字、矩阵、表格型数值数据,只靠原生 list 会不会太慢、太笨重?

这时候,NumPy 往往就是第一个必须掌握的库。

它是 Python 数值计算生态的基础组件。很多你后面会接触到的库,比如 PandasSciPyscikit-learnMatplotlib,底层都离不开它。

如果你是新手,这篇文章的目标不是把 NumPy 讲得特别学术,而是让你尽快搞明白:

  • NumPy 到底是干什么的
  • 它和 Python 原生列表有什么区别
  • 最常用的数组操作怎么写
  • 新手最常用的广播、切片、聚合、条件筛选怎么理解
  • 怎样用一个完整示例快速上手

学完之后,你至少能独立写出常见的数组计算、基础矩阵处理和简单数据预处理代码。

1. NumPy 是什么

NumPy 全名是 Numerical Python,是 Python 里最经典的数值计算库之一。

它最核心的能力是提供一个高效的多维数组对象 ndarray,以及围绕数组进行批量计算的一整套函数。

它特别适合这些场景:

  • 批量数值计算
  • 向量和矩阵运算
  • 数据分析前的数据准备
  • 科学计算和算法实验
  • 机器学习里的特征处理

简单说,NumPy 的优势不是“能不能算”,而是让大量数值操作更快、更整洁、更适合批量处理

2. 为什么很多 Python 学习者都绕不开 NumPy

如果你只处理几条数据,Python 的 list 当然够用。

但一旦进入下面这些场景,NumPy 的价值就会非常明显:

  • 有一大批数字需要统一加减乘除
  • 需要按行按列做统计
  • 需要处理二维表格、矩阵或更高维数据
  • 需要做条件筛选、归一化、标准化
  • 后续还要接入 Pandas 或机器学习库

比如你想把一组商品价格全部打九折,原生列表通常要写循环;用 NumPy,一行就能完成:

prices = np.array([15, 20, 35, 40])
discount = prices * 0.9

这类“整批运算”的能力,就是 NumPy 最值得学的地方。

3. 安装 NumPy

直接安装:

pip install numpy

安装后可以简单检查版本:

python -c "import numpy as np; print(np.__version__)"

导入方式通常这样写:

import numpy as np

npNumPy 的常见别名,几乎所有教程和项目都这么写。

4. 先理解 NumPy 最核心的对象:ndarray

NumPy 里最重要的数据结构是 ndarray,也就是多维数组。

可以先把它理解成“比 list 更适合数值运算的数组”。

先看最简单的创建方式:

import numpy as np

arr = np.array([10, 20, 30, 40])
print(arr)
print(type(arr))

输出类似:

[10 20 30 40]
<class 'numpy.ndarray'>

二维数组也很常见:

matrix = np.array([
    [1, 2, 3],
    [4, 5, 6]
])

print(matrix)

这时候你就可以把它看成一个 2 行 3 列 的数值矩阵。

5. 常见的数组创建方式

5.1 从列表创建

arr = np.array([1, 2, 3, 4, 5])

5.2 创建全 0 数组

zeros = np.zeros((2, 3))

表示创建一个 2 行 3 列 的全零数组。

5.3 创建全 1 数组

ones = np.ones((3, 2))

5.4 创建连续数字

arr = np.arange(1, 10)

这会得到:

[1 2 3 4 5 6 7 8 9]

5.5 创建等间距数组

arr = np.linspace(0, 1, 5)

结果是从 01 均匀切成 5 个点。

6. shape、dtype、ndim 这几个属性一定要熟

NumPy 数组最常用的基础信息包括:

  • shape:形状
  • dtype:数据类型
  • ndim:维度数

示例:

arr = np.array([[1, 2, 3], [4, 5, 6]])

print(arr.shape)
print(arr.dtype)
print(arr.ndim)

输出类似:

(2, 3)
int64
2

这里的意思是:

  • 数组有 2 个维度
  • 形状是 2 行 3 列
  • 元素类型是整数

7. reshape:改变数组形状

reshape()NumPy 里非常高频的方法。

arr = np.arange(1, 13)
matrix = arr.reshape(3, 4)

print(arr)
print(matrix)

输出类似:

[ 1  2  3  4  5  6  7  8  9 10 11 12]
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]

这类操作特别适合把一维数据整理成二维表格结构。

8. 索引和切片

如果你会 Python 列表切片,NumPy 会很快上手,只是二维数组更常见。

arr = np.arange(1, 13).reshape(3, 4)

print(arr[1, 2])
print(arr[:, 1])
print(arr[0:2, 1:3])

含义分别是:

  • arr[1, 2]:第 2 行第 3 列
  • arr[:, 1]:取第 2 列全部数据
  • arr[0:2, 1:3]:取前两行、第 2 到第 3 列

新手一开始最重要的是先把“行列索引”的感觉建立起来。

9. NumPy 为什么适合批量运算

这是 NumPy 最核心的优势之一。

arr = np.array([1, 2, 3, 4])

print(arr + 10)
print(arr * 2)
print(arr / 2)

输出类似:

[11 12 13 14]
[2 4 6 8]
[0.5 1.  1.5 2. ]

也就是说,运算会直接作用到整个数组,而不是要求你手写循环逐个处理。

10. 广播机制,新手一定要先理解个大概

广播是 NumPy 非常经典的特性。你可以把它先简单理解成:

当不同形状的数据在某些规则下可以对齐时,NumPy 会自动帮你把较小的数据“扩展”后再计算。

最常见的例子:

prices = np.array([15, 20, 35, 40])
discount = prices * 0.9
print(discount)

这里数组里的每个元素都会乘以 0.9

再看一个二维例子:

scores = np.array([
    [80, 85, 90],
    [75, 88, 92]
])

bonus = np.array([5, 0, 3])
result = scores + bonus
print(result)

这里 bonus 会按列广播到每一行。

新手不需要一开始就背复杂规则,但要先知道:NumPy 很多“看起来没写循环”的批量计算,本质上都和广播有关。

11. 聚合统计:sum、mean、max、min

做数据处理时,经常需要求和、均值、最大值、最小值。

sales = np.array([
    [1200, 1500, 1800],
    [1000, 1600, 1700],
    [900, 1400, 2100]
])

print(sales.sum())
print(sales.mean())
print(sales.max())
print(sales.min())

如果想按行或按列统计,就用 axis

print(sales.sum(axis=0))   # 按列求和
print(sales.mean(axis=1))  # 按行求均值

可以先记住:

  • axis=0:沿着行方向压缩,通常得到“每列结果”
  • axis=1:沿着列方向压缩,通常得到“每行结果”

12. 条件筛选和布尔数组

NumPy 做筛选非常方便。

scores = np.array([88, 92, 79, 95, 90])
high_scores = scores[scores >= 90]
print(high_scores)

输出:

[92 95 90]

你也可以得到一个布尔数组:

print(scores >= 90)

输出类似:

[False  True False  True  True]

这类写法在做数据清洗和过滤时非常常见。

13. np.where:条件替换

如果你想根据条件生成新结果,np.where() 很常用。

scores = np.array([88, 92, 79, 95, 90])
levels = np.where(scores >= 90, "A", "B")
print(levels)

输出:

['B' 'A' 'B' 'A' 'A']

这个函数在做标签转换、分段判断时很好用。

14. 随机数

做模拟实验、机器学习、测试数据生成时,随机数很常见。

推荐新写法:

rng = np.random.default_rng(seed=42)
arr = rng.integers(0, 10, size=(2, 3))
print(arr)

这里的重点有两个:

  • seed=42 让结果可复现
  • size=(2, 3) 表示生成一个 2 行 3 列 的数组

15. 矩阵乘法

NumPy 当然也支持矩阵运算。

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])

print(a @ b)

输出:

[[19 22]
 [43 50]]

这里的 @ 是矩阵乘法,不是普通的逐元素乘法。

如果写成:

print(a * b)

那就是对应位置逐元素相乘。

16. 一个适合新手直接运行的完整示例

为了方便你本地练习,我把常见操作整理成了一个独立脚本:

numpy_beginner_examples.py

完整代码如下:

import numpy as np


def main() -> None:
    print("1. 创建数组")
    scores = np.array([88, 92, 79, 95, 90])
    matrix = np.array([[1, 2, 3], [4, 5, 6]])
    print("scores =", scores)
    print("matrix =\n", matrix)

    print("\n2. 查看形状和数据类型")
    print("scores.shape =", scores.shape)
    print("matrix.shape =", matrix.shape)
    print("scores.dtype =", scores.dtype)

    print("\n3. reshape 改变形状")
    numbers = np.arange(1, 13)
    reshaped = numbers.reshape(3, 4)
    print("numbers =", numbers)
    print("reshaped =\n", reshaped)

    print("\n4. 索引和切片")
    print("reshaped[1, 2] =", reshaped[1, 2])
    print("reshaped[:, 1] =", reshaped[:, 1])
    print("reshaped[0:2, 1:3] =\n", reshaped[0:2, 1:3])

    print("\n5. 广播机制")
    prices = np.array([15, 20, 35, 40], dtype=float)
    discount = prices * 0.9
    print("prices =", prices)
    print("discount =", discount)

    print("\n6. 聚合统计")
    sales = np.array(
        [
            [1200, 1500, 1800],
            [1000, 1600, 1700],
            [900, 1400, 2100],
        ]
    )
    print("sales =\n", sales)
    print("总销售额 =", sales.sum())
    print("每个月总额 =", sales.sum(axis=0))
    print("每个门店均值 =", sales.mean(axis=1))

    print("\n7. 布尔筛选")
    high_scores = scores[scores >= 90]
    print("scores >= 90 ->", high_scores)

    print("\n8. 条件替换")
    levels = np.where(scores >= 90, "A", "B")
    print("levels =", levels)

    print("\n9. 随机数和可复现结果")
    rng = np.random.default_rng(seed=42)
    random_matrix = rng.integers(0, 10, size=(2, 3))
    print("random_matrix =\n", random_matrix)

    print("\n10. 矩阵乘法")
    a = np.array([[1, 2], [3, 4]])
    b = np.array([[5, 6], [7, 8]])
    print("a @ b =\n", a @ b)


if __name__ == "__main__":
    main()

17. 新手学 NumPy 最容易踩的坑

  • listndarray 混着理解,结果不知道为什么运算行为不同
  • 分不清逐元素乘法 * 和矩阵乘法 @
  • reshape 时元素个数对不上
  • 二维索引时把行列顺序写反
  • 不理解 axis,导致统计结果方向错了

比较稳妥的学习顺序是:

  1. 先学数组创建、shape、dtype
  2. 再学索引切片和 reshape
  3. 再学批量运算、广播、聚合
  4. 最后再学随机数、矩阵计算和和其他库配合

18. 总结

NumPy 是 Python 数值计算最重要的基础库之一。对新手来说,最关键的不是一下子学会所有函数,而是先把下面几个能力练熟:

  • 会创建数组
  • 会看 shape 和 dtype
  • 会切片和 reshape
  • 会做整批运算
  • 会做筛选和统计

只要这几个基础打稳,后面你去学 Pandas、数据分析、机器学习,都会轻松很多。

如果你刚开始练习,建议先把文中的示例脚本跑起来,然后自己扩展这几个方向:

  • 自己构造学生成绩表并做统计
  • 用随机数生成测试数据
  • 自己尝试二维数组按行按列计算
  • 把 NumPy 结果再交给 Pandas 做表格展示

从“会看懂”到“会自己写”,你就算真正入门 NumPy 了。

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐