NumPy Ndarray 对象(一文讲透)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战(已更新的所有项目都能学习) / 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 是一个不可或缺的库。它提供了一个高性能的多维数组对象——NumPy Ndarray,这为数据处理、数值计算和算法实现提供了强大的基础支持。无论是数据分析、机器学习还是图像处理,Ndarray 都是开发者必须掌握的核心工具。
本文将从零开始,通过直观的比喻、代码示例和实际案例,深入浅出地讲解 NumPy Ndarray 对象的原理、用法和应用场景,帮助初学者和中级开发者快速掌握这一工具的核心能力。
一、Ndarray 的基本概念:多维数组的“瑞士军刀”
1.1 什么是 Ndarray?
Ndarray(N-dimensional array)是 NumPy 库中用于存储同类型元素的多维数组对象。它类似于 Python 内置的列表(list),但具备以下显著优势:
- 高性能:底层基于 C 语言实现,运算速度远超纯 Python 遍历。
- 统一性:所有元素必须为相同数据类型,便于高效存储和计算。
- 向量化操作:支持直接对数组进行数学运算,无需显式循环。
比喻:
想象一个仓库,每个货架(维度)上的货物(元素)都整齐排列且类型一致。Ndarray 就像这个仓库的管理系统,能快速定位任意一个货物,或对整层货架进行统一操作(如降价 10%)。
1.2 Ndarray 的核心属性
每个 Ndarray 对象包含以下关键属性:
- shape:数组的维度大小(例如,二维数组的行数和列数)。
- dtype:数组元素的数据类型(如
int32
、float64
)。 - ndim:数组的维度数量(也称阶数)。
示例代码:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
print("Shape:", arr.shape) # 输出 (2, 3)
print("Data Type:", arr.dtype) # 输出 int64(具体类型可能因系统而异)
print("Dimensions:", arr.ndim) # 输出 2
二、创建 Ndarray 的多种方法
2.1 从 Python 列表或元组转换
最直接的方式是通过 np.array()
函数将列表或元组转换为 Ndarray。
代码示例:
a = np.array([1, 2, 3])
print(a) # 输出 [1 2 3]
b = np.array([[1, 2], [3, 4]])
print(b)
2.2 初始化特殊数组
NumPy 提供了多个函数,可以快速生成特定模式的数组:
函数 | 用途 | 示例代码 |
---|---|---|
np.zeros(shape) | 创建全零数组 | np.zeros((2, 3)) |
np.ones(shape) | 创建全一数组 | np.ones((3,)) |
np.arange(start, end, step) | 根据步长生成数列 | np.arange(0, 10, 2) |
np.linspace(start, end, num) | 等分区间生成指定数量的数列 | np.linspace(0, 1, 5) |
np.eye(n) | 创建 n×n 的单位矩阵 | np.eye(3) |
示例代码:
zeros_arr = np.zeros((2, 3))
print(zeros_arr)
seq_arr = np.arange(10)
print(seq_arr) # 输出 [0 1 2 3 4 5 6 7 8 9]
三、Ndarray 的索引与切片:精准访问数据
3.1 基础索引规则
Ndarray 的索引从 0 开始,通过方括号 []
进行访问。对于多维数组,索引需按维度逐级指定:
二维数组的索引示例:
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr[0, 1]) # 访问第一行第二列的元素 → 输出 2
3.2 切片操作:提取子数组
切片语法为 arr[start:end:step]
,支持多维扩展:
代码示例:
subset = arr[:2, :]
print(subset)
column = arr[:, 2]
print(column) # 输出 [3 6 9]
3.3 布尔索引:按条件筛选数据
通过布尔数组(True/False)可筛选满足条件的元素:
示例代码:
mask = arr > 5
filtered = arr[mask]
print(filtered) # 输出 [6 7 8 9]
四、Ndarray 的数学运算与广播机制
4.1 向量化运算:告别循环
Ndarray 支持直接对数组进行数学运算,无需显式循环,代码简洁且高效:
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
result = a + b
print(result) # 输出 [5 7 9]
scaled = a * 2
print(scaled) # 输出 [2 4 6]
4.2 广播机制:形状不匹配时的“魔法”
当两个数组的维度或形状不同时,NumPy 会通过广播规则自动对齐数据,使运算可行。例如:
row_vector = np.array([[1, 2, 3]])
col_vector = np.array([[4], [5], [6]])
result = row_vector + col_vector
print(result)
五、Ndarray 的高级操作:重塑、拼接与分解
5.1 重塑数组:改变维度而不改变数据
通过 reshape()
或 resize()
可调整数组的形状:
original = np.array([1, 2, 3, 4, 5, 6])
reshaped = original.reshape((2, 3))
print(reshaped)
5.2 拼接与分割数组
np.concatenate()
、np.split()
等函数可灵活操作数组结构:
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
combined = np.concatenate((a, b), axis=0)
print(combined)
六、实战案例:图像处理中的 Ndarray 应用
6.1 图像的 Ndarray 表示
图像通常以三维数组存储:height × width × channels
。例如,一张 RGB 图像的形状可能是 (480, 640, 3)
。
调整亮度的代码示例:
import cv2
image = cv2.imread("image.jpg")
brightened = np.clip(image + 50, 0, 255)
cv2.imwrite("brightened.jpg", brightened)
6.2 数据分析中的统计运算
data = np.random.randn(100, 3) # 生成 100×3 的随机数据
mean_values = data.mean(axis=0) # 计算每列的均值
std_values = data.std(axis=0) # 计算每列的标准差
print("均值:", mean_values)
print("标准差:", std_values)
结论
NumPy Ndarray 对象是 Python 科学计算的基石,其高效性、灵活性和丰富的功能使其成为开发者处理数值数据的首选工具。通过本文的讲解,读者应已掌握 Ndarray 的核心概念、创建方法、运算技巧及实际应用场景。
无论是处理图像、分析数据,还是实现机器学习算法,Ndarray 都能通过简洁的代码和强大的性能,帮助开发者快速实现复杂任务。建议读者通过实践练习加深理解,并结合具体项目进一步探索 NumPy 的高级功能。
本文内容旨在帮助读者系统学习 NumPy Ndarray 对象的使用方法,如需深入掌握,请参考官方文档或相关书籍。