NumPy 核心指南:零基础入门与实践
NumPy 简介
NumPy(Numerical Python)是 Python 语言的一个扩展程序库,支持大量的多维数组及矩阵运算,此外也针对数组运算提供大量的数学函数库。
发展历史
NumPy 的前身 Numeric 早在 1995 年就诞生了,后来在 2005 年,Travis Oliphant 在 Numeric 的基础上创建了 NumPy,增加了对不同类型数据的支持等功能,使其成为目前 Python 数据科学领域中最重要、最基础的库之一。
重要地位
NumPy 是许多其他 Python 科学计算库(如 SciPy、Pandas、Matplotlib 等)的基础,它高效地处理多维数组的能力,让数据处理变得快捷而方便,为数据分析、机器学习等众多领域提供了强大的支持。
NumPy 数组基础
数组创建
一维数组
import numpy as nparr = np.array([1, 2, 3, 4])print(arr)print(type(arr)) # <class 'numpy.ndarray'>
运行结果为:[1 2 3 4],输出的类型表明这是一个 NumPy 的多维数组对象(ndarray)。
二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])print(arr2)
输出:
[[1 2 3][4 5 6]]
三维数组
arr3 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])print(arr3)
输出:
[[[1 2][3 4]][[5 6][7 8]]]
数组属性
ndim
表示数组的维度。
print(arr.ndim) # 1print(arr2.ndim) # 2print(arr3.ndim) # 3
shape
表示数组形状,即每个维度的大小。
print(arr.shape) # (4,)print(arr2.shape) # (2, 3)print(arr3.shape) # (2, 2, 2)
dtype
表示数组中元素的数据类型。
print(arr.dtype) # int64,具体类型可能因系统环境有所不同arr4 = np.array([1.0, 2.0, 3.0])print(arr4.dtype) # float64
size
表示数组元素个数。
print(arr.size) # 4print(arr2.size) # 6print(arr3.size) # 8
数组操作
切片与索引
一维数组索引和切片
arr = np.array([1, 2, 3, 4, 5])print(arr[0]) # 1,取索引为 0 的元素print(arr[1:4]) # [2 3 4],取索引 1 到 3 的元素
二维数组索引
arr2 = np.array([[1, 2, 3], [4, 5, 6]])print(arr2[1, 2]) # 6,取第二行第三列元素# 取第一行的所有元素print(arr2[0, :]) # [1 2 3]# 取所有行的第二列元素print(arr2[:, 1]) # [2 5]
重塑数组
arr = np.array([1, 2, 3, 4, 5, 6])arr2 = arr.reshape(2, 3)print(arr2)
输出:
[[1 2 3][4 5 6]]
还可以将一维数组重塑为三维数组:
arr3 = arr.reshape(2, 1, 3)print(arr3)
输出:
[[[1 2 3]][[4 5 6]]]
拼接与拆分数组
拼接数组
arr1 = np.array([1, 2, 3])arr2 = np.array([4, 5, 6])arr3 = np.concatenate((arr1, arr2))print(arr3) # [1 2 3 4 5 6]# 沿不同轴拼接二维数组arr4 = np.array([[1, 2], [3, 4]])arr5 = np.array([[5, 6], [7, 8]])arr6 = np.concatenate((arr4, arr5), axis=0) # 沿行(轴 0)拼接print(arr6)
输出:
[[1 2][3 4][5 6][7 8]]
arr7 = np.concatenate((arr4, arr5), axis=1) # 沿列(轴 1)拼接print(arr7)
输出:
[[1 2 5 6][3 4 7 8]]
拆分数组
arr = np.array([1, 2, 3, 4, 5, 6])arr1, arr2, arr3 = np.split(arr, 3) # 将数组平均拆分为 3 部分print(arr1) # [1 2]print(arr2) # [3 4]print(arr3) # [5 6]# 指定拆分位置arr4, arr5 = np.split(arr, [2]) # 在索引 2 处拆分print(arr4) # [1 2]print(arr5) # [3 4 5 6]
数组运算
矢量化运算
arr1 = np.array([1, 2, 3])arr2 = np.array([4, 5, 6])print(arr1 + arr2) # [5 7 9]print(arr1 - arr2) # [-3 -3 -3]print(arr1 * arr2) # [4 10 18]print(arr1 / arr2) # [0.25 0.4 0.5]
广播机制
arr = np.array([1, 2, 3])print(arr + 2) # [3 4 5]arr2 = np.array([[1, 2, 3], [4, 5, 6]])print(arr2 + arr) # [[2 4 6][5 7 9]]
数组与矩阵运算
arr1 = np.array([1, 2, 3])arr2 = np.array([4, 5, 6])print(arr1.dot(arr2)) # 32,点积运算arr3 = np.array([[1, 2, 3], [4, 5, 6]])print(arr3.T) # [[1 4][2 5][3 6]],矩阵转置
NumPy 与 Python 列表的比较
内存效率示例
创建一个包含 1000 万个元素的列表和 NumPy 数组来比较内存占用。
import syslist_data = list(range(10000000))numpy_data = np.arange(10000000)print(sys.getsizeof(list_data) * len(list_data)) # 列表内存占用(字节)print(numpy_data.nbytes) # NumPy 数组内存占用(字节)
通常 NumPy 数组会比列表节省大量内存。
性能优势示例
对两个各含 1000 万个元素的列表和 NumPy 数组分别进行加法运算比较耗时。
import timelist1 = list(range(10000000))list2 = list(range(10000000))start_time = time.time()list_result = [x + y for x, y in zip(list1, list2)]list_time = time.time() - start_timenumpy1 = np.array(list1)numpy2 = np.array(list2)start_time = time.time()numpy_result = numpy1 + numpy2numpy_time = time.time() - start_timeprint(f"列表运算耗时:{list_time}")print(f"NumPy 数组运算耗时:{numpy_time}")
NumPy 数组运算通常会比列表循环快一两个数量级。
功能丰富示例
NumPy 提供大量的数学函数,比如计算数组的平方根等。
arr = np.array([1, 4, 9, 16])print(np.sqrt(arr)) # [1. 2. 3. 4.]
而对 Python 列表进行同样的操作需要循环结合数学函数来实现。
NumPy 高级功能
布尔索引
arr = np.array([1, 2, 3, 4, 5])bool_arr = arr > 2print(bool_arr) # [False False True True True]print(arr[bool_arr]) # [3 4 5]# 更常用的写法print(arr[arr > 2]) # [3 4 5]
随机数生成
# 生成随机整数arr = np.random.randint(0, 10, (2, 3))print(arr)# 生成随机浮点数数组arr_float = np.random.rand(3, 4) # 生成形状为(3,4)的浮点数数组,数值范围在[0,1)print(arr_float)# 生成符合正态分布的随机数数组arr_normal = np.random.randn(2, 2) # 均值为0,方差为1的正态分布print(arr_normal)
统计分析
arr = np.array([[1, 2, 3], [4, 5, 6]])print(np.mean(arr)) # 3.5,整个数组的均值print(np.mean(arr, axis=0)) # [2.5 3.5 4.5],按列求均值print(np.mean(arr, axis=1)) # [2. 5.],按行求均值print(np.median(arr)) # 3.5,中位数print(np.std(arr)) # 标准差
文件读写
保存和加载 .npy 文件
arr = np.array([1, 2, 3])np.save('arr.npy', arr)loaded_arr = np.load('arr.npy')print(loaded_arr)
文本文件读写
# 假设有一个文本文件 data.txt,内容如下:# 1 2 3# 4 5 6# 7 8 9arr = np.loadtxt('data.txt')print(arr)# 将数组保存为文本文件np.savetxt('new_data.txt', arr)
通过以上详细介绍,初学者可以从基础到高级全面了解 NumPy 的知识和用法,为进一步学习数据分析等相关领域打下坚实基础。
以上内容全面介绍了 NumPy 的常用知识。你若觉得某些部分需要更详细的解释,或想补充其他相关内容,欢迎随时告知。