python numpy(保姆级教程)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新开坑项目:《Spring AI 项目实战》 正在持续爆肝中,基于 Spring AI + Spring Boot 3.x + JDK 21..., 点击查看 ;
  • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言:为什么 Python NumPy 是数据科学的基石?

在编程世界中,Python 以其简洁优雅的语法和丰富的生态赢得了开发者们的青睐。而在科学计算领域,Python NumPy 凭借其高效的数组运算能力和底层优化,成为数据处理、机器学习和工程计算的“隐形冠军”。无论是处理百万级数据集,还是构建复杂的数学模型,NumPy 都能以优雅的方式完成任务。

对于编程初学者而言,NumPy 可能是一个陌生的概念;但随着对数据处理需求的增加,掌握它就像拥有了“数据处理的瑞士军刀”。本文将从基础到进阶,通过生动的比喻和实际案例,带读者一步步理解 NumPy 的核心思想,并掌握其在真实场景中的应用。


一、安装与快速入门:你的第一个 NumPy 数组

安装 NumPy

在 Python 环境中安装 NumPy 非常简单,只需在终端执行以下命令:

pip install numpy

创建基础数组

NumPy 的核心是 ndarray(N-dimensional array),即多维数组对象。我们可以用以下代码创建一个简单的数组:

import numpy as np  # 习惯性导入并简写为 np

arr_1d = np.array([1, 2, 3, 4, 5])
print("一维数组:", arr_1d)

matrix = np.array([[1, 2, 3], [4, 5, 6]])
print("二维数组:\n", matrix)

比喻时间
可以把 ndarray 想象成一个超级仓库,每个元素都有固定的位置(索引),而仓库的“货架结构”(维度)决定了数据的排列方式。例如,二维数组就像两层货架,每一层存放一排商品。


二、数组的属性与基本操作:理解数据的“基因”

数组的基本属性

了解数组的形状、维度和数据类型是操作的基础:

print("数组维度:", arr_1d.ndim)       # 输出:1
print("数组形状:", matrix.shape)      # 输出:(2, 3)
print("元素数据类型:", arr_1d.dtype)  # 输出:int32(具体类型可能因系统而异)

数组的索引与切片

与 Python 列表类似,但 NumPy 的索引操作更高效:

print("第一个元素:", arr_1d[0])        # 输出:1

print("前三个元素:", arr_1d[:3])      # 输出:[1 2 3]

print("第二行第三列元素:", matrix[1, 2])  # 输出:6

关键区别
Python 列表切片会返回新列表,而 NumPy 的切片操作返回的是原数组的视图(view),修改视图会直接影响原数组。这一点需要特别注意!


三、数组的创建与初始化:从零开始构建你的数据

NumPy 提供了丰富的函数来快速创建数组,以下是常用方法:

函数名描述示例代码
np.zeros(shape)创建指定形状的全零数组np.zeros((2, 3))
np.ones(shape)创建全一数组np.ones((3,))
np.arange(start, stop, step)生成等差数列np.arange(0, 10, 2) → [0,2,4,6,8]
np.linspace(start, stop, num)生成指定数量的等间隔数列np.linspace(0, 1, 5) → [0. 0.25 0.5 0.75 1.]
np.random.rand(d0, d1, ...)创建指定形状的随机数组(0-1均匀分布)np.random.rand(2,2)

实际案例
假设我们要生成一个 3x3 的单位矩阵(对角线为1,其余为0),可以使用:

identity_matrix = np.eye(3)
print("单位矩阵:\n", identity_matrix)

四、矢量化操作:告别循环,拥抱效率革命

在传统 Python 中,对数组元素逐个操作需要循环:

result = []
for num in arr_1d:
    result.append(num * 2)

而 NumPy 的矢量化操作可以让计算直接作用于整个数组:

result_vectorized = arr_1d * 2

效率对比
假设有一个包含 100 万个元素的数组,矢量化操作比循环快约 1000 倍。这是因为 NumPy 的底层用 C 语言实现,避免了 Python 解释器的循环开销。


五、广播机制:让不同形状的数组“和平共处”

广播(Broadcasting)是 NumPy 的一项黑科技,它允许不同形状的数组进行算术运算。例如:

a = np.array([1, 2, 3])
b = 5
print(a + b)  # 输出:[6 7 8]

matrix = np.array([[1, 2, 3], [4, 5, 6]])
vector = np.array([10, 20, 30])
print(matrix + vector)  # 输出:[[11 22 33], [14 25 36]]

广播规则
当两个数组的维度不同时,NumPy 会从右到左比较轴的大小,若满足以下条件之一,则可以广播:

  1. 轴的大小相等;
  2. 其中一个轴的大小为 1。

比喻时间
广播就像复印机——当两个“数据纸张”的尺寸不同时,较小的纸张会被“复印”到与较大纸张相同的尺寸,再进行运算。


六、实际案例:用 NumPy 解决真实问题

案例 1:学生成绩统计

假设我们有一组学生成绩数据,需要计算平均分、标准差和及格率:

scores = np.array([78, 92, 85, 67, 88, 95, 55, 73, 89, 77])

average = np.mean(scores)
std_dev = np.std(scores)
pass_rate = np.sum(scores >= 60) / len(scores) * 100

print(f"平均分:{average:.1f}")
print(f"标准差:{std_dev:.1f}")
print(f"及格率:{pass_rate:.1f}%")

案例 2:图像亮度调整

将图像的每个像素值乘以一个系数来调整亮度(假设图像数据为 NumPy 数组):

brightness_factor = 1.2  # 提亮 20%
adjusted_image = np.clip(image * brightness_factor, 0, 255)

七、进阶技巧:让 NumPy 更加得心应手

1. 条件筛选与布尔索引

high_scores = scores[scores > 80]

2. 数组的拼接与分割

combined = np.hstack((arr_1d, arr_1d))

split_result = np.split(matrix, 2, axis=0)

3. 自定义函数与 apply_along_axis

def square(x):
    return x ** 2

result = np.apply_along_axis(square, axis=1, arr=matrix)

结论:NumPy 是通往高效计算的桥梁

通过本文的学习,我们看到了 Python NumPy 如何将繁琐的数据操作转化为简洁高效的代码。从基础的数组操作到广播机制,再到实际案例的实践,NumPy 展示了其作为科学计算核心库的强大能力。

对于初学者,建议从简单的数组创建和运算开始,逐步掌握矢量化和广播的原理。中级开发者则可以深入探索更复杂的操作,如数组的高级索引和与 Pandas 等库的结合使用。

记住,NumPy 的力量不仅在于其功能,更在于它背后的思维方式——用数组和向量化操作代替循环,这正是现代数据处理的核心理念。当你下次面对海量数据时,不妨让 NumPy 成为你最得力的助手!

最新发布