一、为什么是NumPy?
在开始之前,我们先要明白为什么不用Python原生的列表(List)。Python列表非常灵活,可以存储不同类型的数据,但正是这种灵活性导致了它在进行数值计算时效率低下。
NumPy数组(ndarray)则不同:
-
同质性强:数组中的所有元素必须是相同类型。
-
效率极高:底层由C语言实现,连续存储,支持向量化操作。
-
功能丰富:提供了大量优化的数学函数。
简单来说,当你需要进行大量的数值计算时,NumPy数组比Python列表快几个数量级。
二、创建NumPy数组
首先,我们需要导入NumPy库。社区惯例是将其导入为 np。
import numpy as np
创建数组有多种方式:
-
从Python列表/元组创建
python
# 创建一维数组 arr1d = np.array([1, 2, 3, 4, 5]) print("一维数组:", arr1d) # 创建二维数组 arr2d = np.array([[1, 2, 3], [4, 5, 6]]) print("二维数组:\n", arr2d) -
使用内置函数创建
python
# 创建全0数组 zeros_arr = np.zeros((3, 4)) # 3行4列 print("全0数组:\n", zeros_arr) # 创建全1数组 ones_arr = np.ones((2, 3)) print("全1数组:\n", ones_arr) # 创建单位矩阵(对角线为1) eye_arr = np.eye(3) print("单位矩阵:\n", eye_arr) # 创建指定范围的数组 range_arr = np.arange(0, 10, 2) # 从0开始,到10结束(不含),步长为2 print("arange数组:", range_arr) # 创建等间隔数组 linspace_arr = np.linspace(0, 1, 5) # 从0到1,生成5个等间隔的数 print("linspace数组:", linspace_arr)三、数组的索引与切片
这是操作数组最常用的技能,与Python列表类似,但功能更强大。
-
一维数组索引切片
python
arr = np.array([10, 20, 30, 40, 50]) print(arr[0]) # 输出:10 print(arr[1:4]) # 输出:[20 30 40] (切片,含头不含尾) print(arr[::2]) # 输出:[10 30 50] (步长为2)
多维数组索引切片
python
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print("原始数组:\n", arr2d) print(arr2d[0, 1]) # 输出:2 (第0行,第1列) print(arr2d[1]) # 输出:[4 5 6] (第1行) print(arr2d[:, 1]) # 输出:[2 5 8] (所有行的第1列,这是NumPy的特色!) print(arr2d[0:2, 1:3]) # 输出第0、1行和第1、2列的交集 # [[2 3] # [5 6]] -
重要提示: NumPy的切片是原始数组的视图,这意味着修改切片会修改原始数组!如果需要副本,请使用
.copy()方法。python
slice_of_arr = arr2d[0:2].copy() #
-
四、数组的形状操作
了解并改变数组的形状是数据处理中的常见操作。
python
arr = np.arange(12) # [0, 1, 2, ..., 11] print("原始形状:", arr.shape) # 输出:(12,) # 改变形状 arr_reshaped = arr.reshape(3, 4) # 变为3行4列的二维数组 print("重塑后:\n", arr_reshaped) # 展平数组 arr_flattened = arr_reshaped.flatten() # 或使用 .ravel() print("展平后:", arr_flattened) # 转置 arr_transposed = arr_reshaped.T print("转置后:\n", arr_transposed)五、数组的广播(Broadcasting)
广播是NumPy最强大也最容易让人困惑的特性之一。它描述的是NumPy如何在算术运算中处理不同形状的数组。
核心规则:从尾部维度开始,逐维度比较,维度相等或其中一方为1时,可以广播。
看几个例子就明白了:
python
# 示例1:数组与标量运算(标量会被广播到所有元素) arr = np.array([1, 2, 3]) result = arr + 5 print(result) # 输出:[6 7 8] # 示例2:不同形状的数组相加 a = np.array([[1, 2, 3], [4, 5, 6]]) # 形状 (2, 3) b = np.array([10, 20, 30]) # 形状 (3,) # b会被广播成 [[10, 20, 30], [10, 20, 30]],然后与a相加 result = a + b print(result) # 输出: # [[11 22 33] # [14 25 36]]
六、总结
NumPy数组是Python数据科学生态的基石。掌握其创建、索引、切片、形状操作和广播机制,是后续学习Pandas、Scikit-learn、Matplotlib等更高级库的必备前提。建议大家在理解理论后,多动手敲代码,亲自体验NumPy带来的高效与便捷。
希望这篇博客能帮助你打下坚实的基础!如果你有任何问题,欢迎在评论区留言讨论。
1020

被折叠的 条评论
为什么被折叠?



