巧用Python的NumPy库进行数值计算
宝子们,今天咱来唠唠Python里超厉害的一个库——NumPy。在数据处理、科学计算的江湖里,它可是响当当的“大侠”!要是你玩Python还没和NumPy混熟,那可就像剑客少了把利剑,关键时刻总差那么点意思。
一、NumPy库简介
NumPy,全称 Numerical Python,是Python的基础科学计算库。它提供了高性能的多维数组对象(ndarray),啥概念呢?就好比给你个超给力的“数据收纳盒”,规整又高效。而且它自带一箩筐丰富的函数库,专门处理这些数组数据,从简单的数学运算到复杂的线性代数,统统不在话下。毫不夸张地说,它可是众多超火的数据科学、机器学习库的“地基”,像 Pandas、Scikit-learn 这些大佬,都得站在它的肩膀上搞事情。
二、NumPy数组的创建
从Python基本数据结构创建
咱日常用的 Python 列表、元组,想变身成 NumPy 数组,那是分分钟的事儿。只要用 np.array() 函数一招搞定。比如说,咱有个列表 [1, 2, 3, 4, 5],代码这么写:
import numpy as np
my_list = [1, 2, 3, 4, 5]
numpy_array = np.array(my_list)
print(numpy_array)
运行一下,列表就华丽变身为整齐的 NumPy 数组啦,打印出来就是 [1 2 3 4 5],是不是超简单?
运用特定函数创建特定数组
要是咱想偷懒,直接生成一些特殊数组,NumPy 也给咱备着“捷径”。像 np.zeros() 能一键生成全零数组,假如咱要个 3 行 4 列的全零矩阵,代码:
zero_array = np.zeros((3, 4))
print(zero_array)
打印出来就是个规规矩矩的 3×4 全零矩阵。还有 np.ones() 搞全一数组,np.arange() 按指定范围创建等间隔数组,np.linspace() 按咱给定的样本数量生成等间隔数组,各有各的神通,就看咱啥需求啦。
三、NumPy数组的属性查看
维度、形状与元素个数查看
创建完数组,咱总得瞅瞅它长啥样吧。用 ndim 能查看数组维度,shape 查看各维度的尺度,size 瞅一眼元素个数。比如咱刚生成的那个 3×4 全零矩阵:
print(zero_array.ndim)
print(zero_array.shape)
print(zero_array.size)
依次打印出 2(二维数组)、(3, 4)(3 行 4 列)、12(一共 12 个元素),瞬间对数组了如指掌。
元素类型及大小查看
再看看数组里元素是啥类型,占多大空间,dtype 查元素类型,itemsize 看每个元素大小。像:
print(zero_array.dtype)
print(zero_array.itemsize)
对于全零数组,元素是 float64 类型,每个元素占 8 个字节,是不是一清二楚啦?
四、NumPy数组的基本操作
数组的形状变换
有时候数组形状不合心意,没事,reshape() 函数来救场。咱有个一维数组想变成二维的,代码:
one_d_array = np.arange(12)
new_shape_array = one_d_array.reshape(3, 4)
print(new_shape_array)
原本 12 个元素的一维数组,就变成 3 行 4 列的二维数组啦。要是想拍扁成一维,flatten() 函数上场,多维数组立马变一维,超好用。还有 swapaxes() 函数,能像变魔术一样调换数组维度,数据处理的花样玩法它都懂。
数组的拼接与分割
数据整合、拆分少不了。np.concatenate() 沿指定轴连接数组,好比把积木按咱想要的方向拼起来。要是有俩数组 [1, 2, 3] 和 [4, 5, 6],想按行拼一起:
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
concat_array = np.concatenate((arr1, arr2))
print(concat_array)
就得到 [1 2 3 4 5 6]。想分开?np.split() 沿指定轴分割数组,不管是平均分还是按咱指定位置分,都能妥妥搞定。
五、NumPy中的数学运算
基本算术运算
NumPy 搞数学运算,那叫一个丝滑。数组加法、减法、乘法、除法,直接上就行,不用咱傻乎乎地写循环遍历。像俩数组 [1, 2, 3] 和 [4, 5, 6] 相加:
arr_a = np.array([1, 2, 3])
arr_b = np.array([4, 5, 6])
sum_array = arr_a + arr_b
print(sum_array)
直接得出 [5 7 9],一步到位,这效率,杠杠的。
通用函数运用
求平方根、指数值、绝对值这些操作,NumPy 有专门的通用函数。np.sqrt() 求平方根,给个数组 [4, 9, 16],代码:
sqrt_array = np.sqrt([4, 9, 16])
print(sqrt_array)
立马算出 [2. 3. 4.]。np.exp() 求指数,np.abs() 取绝对值,这些函数能直接在数组上玩元素级操作,数学计算从此变得 so easy。
六、NumPy的统计分析函数
均值、最值与方差
想分析数组的统计特征,NumPy 给咱备齐工具。np.mean() 求均值,比如有个数组 [1, 2, 3, 4, 5]:
stats_array = np.array([1, 2, 3, 4, 5])
mean_value = np.mean(stats_array)
print(mean_value)
算出均值 3。np.max() 找最大值,np.min() 挖最小值,np.var() 求方差,数据的脾气秉性,通过这些函数一测一个准。
中位数与百分位数
找中位数用 np.median(),像数组 [1, 3, 2, 4, 5]:
median_array = np.array([1, 3, 2, 4, 5])
median_value = np.median(median_array)
print(median_value)
算出中位数 3。要是想知道数据在某个百分位的情况,np.percentile() 上场,不管是看成绩分布还是数据趋势,它都能给出关键指标。
七、NumPy的线性代数运算
矩阵乘法
线性代数里矩阵乘法家常便饭,NumPy 用 np.dot() 函数轻松拿捏。俩矩阵相乘,代码:
matrix_a = np.array([[1, 2], [3, 4]])
matrix_b = np.array([[5, 6], [7, 8]])
product_matrix = np.dot(matrix_a, matrix_b)
print(product_matrix)
按规则算出乘积矩阵,这对处理图像、机器学习里的模型参数运算可太重要啦。
逆矩阵与行列式计算
求逆矩阵用 np.linalg.inv(),算行列式用 np.linalg.det()。给个简单矩阵,像:
square_matrix = np.array([[1, 2], [3, 4]])
inverse_matrix = np.linalg.inv(square_matrix)
determinant = np.linalg.det(square_matrix)
print(inverse_matrix)
print(determinant)
瞬间算出逆矩阵和行列式的值,线性代数难题迎刃而解。
八、NumPy数组的索引与切片
一维数组的索引与切片
一维数组取元素,跟咱取列表元素类似,用索引定位单个元素,切片获取部分元素。比如数组 [1, 2, 3, 4, 5],取第三个元素:
one_dim = np.array([1, 2, 3, 4, 5])
print(one_dim[2])
得到 3。要是取中间三个元素,切片操作:
print(one_dim[1:4])
打印出 [2 3 4],简单又好用。
多维数组的索引与切片
多维数组索引、切片稍微复杂点,但也有套路。二维数组咱就用行列索引定位元素,像:
two_dim = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(two_dim[1, 2])
取出第二行第三列的元素 6。切片的话,按维度分别切就行,玩转多维数据,就靠它啦。
九、NumPy的随机数生成
做模拟、搞实验,随机数不能少。NumPy 里 np.random.rand() 生成均匀分布随机数,取值范围 0 到 1。要是生成 5 个:
rand_array = np.random.rand(5)
print(rand_array)
得到 5 个随机小数。np.random.randn() 生成标准正态分布随机数,还有各种参数设定,能生成咱想要的各种分布随机数,为数据分析、算法测试提供无限可能。
宝子们,NumPy 的本事可远不止这些,今天只是浅尝辄止。赶紧动手试试,让你的 Python 数据处理技能原地起飞,以后不管是科研、工作还是玩数据,都能游刃有余!
怎么样,这波干货够硬吧,要是还有啥疑问,评论区留言,咱一起探讨!