前言
大家好呀!今天咱们来聊聊Python中一个超级强大的库——Numpy。作为一个Python初学者,你可能已经听说过它的大名了。Numpy可以说是Python科学计算的基石,很多其他库比如Pandas、Scikit-learn都是基于它构建的。所以,学好Numpy真的很重要!
什么是Numpy?
简单来说,Numpy就是一个专门用来处理数组(array)的库。它提供了高性能的多维数组对象,以及用于操作这些数组的各种工具。相比Python自带的列表(list),Numpy数组在存储和计算效率上都有巨大优势。
安装Numpy
首先,咱们得安装Numpy。安装方式主要有以下几种:
1.通过pip安装(推荐)
pip install numpy
2.通过Anaconda安装: 如果你使用的是Anaconda发行版,Numpy已经预装在基础环境中,无需额外安装。可以通过以下命令验证:
conda list numpy
安装完成后,在Python中导入Numpy的标准方式是:
import numpy as np
这样后面写代码会方便很多,`np`就是Numpy的简称啦~
创建Numpy数组
在使用Numpy进行科学计算和数据分析时,创建数组是整个流程中最基础也是最关键的一步。Numpy作为Python中处理数值数据的核心库,提供了极为灵活且高效的数组构造方式,使得用户能够根据不同的需求快速生成所需的数据结构。
从列表创建
最直接的方式就是从Python列表创建:这种方法不仅语法简洁,而且易于理解,特别适合初学者入门以及在实际项目中快速原型开发。
import numpy as np
一维数组
当我们需要创建一个一维的Numpy数组时,可以调用`np.array()`函数,并将一个普通的Python列表作为参数传入。例如,若我们有一个包含五个整数的列表`[1, 2, 3, 4, 5]`,只需将其传递给`np.array()`函数即可生成对应的一维数组。代码如下所示:
arr1 = np.array([1, 2, 3, 4, 5])
print(arr1)
执行这段代码后,系统会输出一个形状为(5,)的一维数组,其内部元素依次为1到5。这种由列表转换而来的数组具备Numpy数组的所有特性,比如支持向量化运算、广播机制以及更高效的内存管理。
二维数组
除了创建一维数组之外,Numpy同样支持通过嵌套列表的方式来构造多维数组,尤其是二维数组,这在矩阵运算、图像处理和机器学习等领域应用广泛。例如,我们可以将一个包含两个子列表的列表传入`np.array()`函数,每个子列表代表二维数组中的一行。假设我们要创建一个两行三列的二维数组,其内容分别为第一行`[1, 2, 3]`,第二行`[4, 5, 6]`,则可以通过以下方式实现:
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2)
运行结果将是一个2×3的二维数组,形式上类似于数学中的矩阵结构。该数组可以用于基本的算术操作,还可以参与线性代数运算、索引切片、转置等高级操作。
特殊数组
Numpy还提供了一些创建特殊数组的方法:
全零数组
在某些算法中我们需要一个所有元素均为0的数组作为初始占位符或缓存空间,此时就可以使用`np.zeros()`函数。该函数接受一个表示数组形状的元组作为参数,返回一个指定维度且元素全为0的浮点型数组。
zeros = np.zeros((3, 4)) # 3行4列的全零数组
print(zeros)
全一数组
类似地,如果希望创建所有元素都为1的数组,则可以使用`np.ones()`函数。
ones = np.ones((2, 3)) # 2行3列的全一数组
print(ones)
单位矩阵
单位矩阵,它在矩阵求逆、线性变换以及特征值分析中扮演着重要角色。Numpy通过`np.eye()`函数提供了便捷的单位矩阵生成方法。例如,调用`np.eye(3)`将会返回一个3×3的方阵,其主对角线上的元素为1,其余位置均为0。
eye = np.eye(3) # 3x3的单位矩阵
print(eye)
等差数列&等间距数列
除此之外,当需要生成具有一定规律的数值序列时,Numpy也提供了两种强大的工具:`np.arange()`和`np.linspace()`。前者模仿了Python原生的`range()`函数,但返回的是Numpy数组而非迭代器。它可以指定起始值、终止值(不包含)以及步长,从而生成等差数列。
相比之下,`np.linspace()`则更适合于生成在某个区间内均匀分布的数值点,尤其适用于绘图时设置横坐标轴的刻度。该函数接收三个主要参数:起始值、结束值以及希望生成的总点数,默认情况下包含终点。
arange = np.arange(0, 10, 2) # 从0开始,到10结束(不包括10),步长为2
print(arange)
linspace = np.linspace(0, 1, 5) # 0到1之间均匀分布的5个数
print(linspace)
数组的基本操作
下面我们将详细探讨数组的多个核心操作,包括数组的形状属性、如何改变数组的结构、以及数组的索引与切片机制。
数组形状
创建一个二维数组,这个数组包含了两行三列的数据元素。通过调用 arr.shape 方法,我们可以获取该数组的维度信息。此外,arr.size 属性用于返回数组中所有元素的总数,在本例中总共有六个数字,因此 size 的值为6。而 arr.ndim 则表示数组的维度数量,由于这是一个由行和列构成的二维结构,所以 ndim 返回的结果是2。这些属性共同帮助我们全面了解一个数组的结构特征。
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.shape) # 输出 (2, 3),表示2行3列
print(arr.size) # 输出 6,表示总共有6个元素
print(arr.ndim) # 输出 2,表示是二维数组
改变数组形状
接下来讨论如何改变数组的形状。在实际应用中,我们经常需要将一维数组转换为二维数组,或者反过来将高维数组展平为一维形式,以便于进一步处理。
改变形状
例如,使用 np.arange(6) 可以生成一个包含从0到5共六个连续整数的一维数组。如果我们希望将其重新组织成一个2行3列的二维结构,就可以调用 reshape(2, 3) 方法。该方法不会改变原始数据的内容,而是返回一个新的视图或副本,其数据按照指定的新维度排列。值得注意的是,reshape 操作要求新形状的总元素数量必须与原数组一致,否则会抛出异常。
arr = np.arange(6)
print(arr.reshape(2, 3)) # 变成2行3列
展平数组
除了 reshape 外,另一个常用的操作是 flatten,它能够将任意维度的数组转换为一维数组。比如有一个二维数组 arr = np.array([[1, 2], [3, 4]]),调用 arr.flatten() 后会得到 [1, 2, 3, 4] 这样一个扁平化的一维序列。
arr = np.array([[1, 2], [3, 4]])
print(arr.flatten()) # 变成一维数组 [1, 2, 3, 4]
数组索引和切片
这个和Python列表很像,但是更强大,尤其是在多维数据上的表现。
arr = np.array([1, 2, 3, 4, 5])
索引
对于一维数组,我们可以通过下标访问特定位置的元素:arr[0] 获取第一个元素1,arr[-1] 则获取最后一个元素5,负数索引允许我们从数组末尾开始计数。
print(arr[0]) # 输出1
print(arr[-1]) # 输出5
切片
切片操作则允许我们提取一段连续的子数组,例如 arr[1:4] 表示从索引1开始到索引4之前(不包含4)的所有元素,因此返回结果是 [2, 3, 4]。这种切片语法支持步长参数,还可以实现逆序提取等复杂操作。
print(arr[1:4]) # 输出[2, 3, 4]
二维数组
当涉及到二维数组时,要访问其中某个具体元素,可以使用逗号分隔的双索引方式。例如 arr2d[0, 1] 表示第0行第1列的元素,即数值2。而在进行切片时,我们可以分别对行和列设定范围。例如表达式 arr2d[1:, :2] 中,1: 表示从第1行开始一直到最后一行(即第1行和第2行),而 :2 表示从第0列到第1列(前两列)。因此最终结果是一个由第1、2行与前两列交叉组成的子数组,输出为 [[4, 5], [7, 8]]。
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr2d[0, 1]) # 输出2
print(arr2d[1:, :2]) # 输出[[4, 5], [7, 8]]
数组运算
Numpy最强大的地方就是它的向量化运算能力:所谓向量化运算,指的是无需使用显式的循环结构,即可对整个数组中的所有元素同时执行数学运算。这不仅极大地提升了代码的执行效率,还使代码更加简洁、易读。例如,我们可以定义两个一维数组a和b,分别赋值为a = np.array([1, 2, 3])与b = np.array([4, 5, 6]),随后便可以直接对这两个数组进行各种基本的算术操作。
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
加法
在加法运算中,表达式a + b会自动将两个数组对应位置上的元素逐一相加,最终输出结果为[5, 7, 9]。
print(a + b) # [5, 7, 9]
减法
同样地,在减法运算中,a - b会计算每个对应位置元素之间的差值,得到的结果是[-3, -3, -3],
print(a - b) # [-3, -3, -3]
乘法(元素相乘)
当涉及到乘法时,NumPy默认执行的是逐元素相乘(也称为哈达玛积),而不是矩阵乘法。因此,a * b的结果为[4, 10, 18],这是由1×4、2×5、3×6分别计算得出的。
print(a * b) # [4, 10, 18]
除法
对于除法操作,若执行b / a,则会返回一个包含各对应元素商的新数组,具体结果为[4.0, 2.5, 2.0],其中数据类型自动转换为浮点型以保证精度。
print(b / a) # [4., 2.5, 2.]
平方
此外,NumPy还支持数组的幂运算。例如,a ** 2表示将数组a中的每一个元素都进行平方处理,结果生成新的数组[1, 4, 9]。
print(a ** 2) # [1, 4, 9]
点积
而在需要计算两个向量内积的情况下,可以调用np.dot(a, b)函数,该函数将两个数组对应元素相乘后再求和,最终返回标量值32,其计算过程为1×4 + 2×5 + 3×6 = 4 + 10 + 18 = 32,这正是线性代数中标准的点积定义。
print(np.dot(a, b)) # 32 (14 + 25 + 3*6)
广播机制
NumPy另一个极为重要的特性是广播机制,广播机制可以让不同形状的数组进行运算,只要它们的维度大小满足一定的兼容条件。比如,考虑一个二维数组a,它具有两行三列的结构,以及一个一维数组b,长度为3。尽管两者维度不同,但由于b的最后一个维度长度与a的列数一致,NumPy能够自动将其“广播”成一个与a形状相同的二维数组[[10, 20, 30], [10, 20, 30]],然后逐元素地与a相加。因此,执行print(a + b)后,输出的结果为[[11, 22, 33], [14, 25, 36]]。
a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([10, 20, 30])
print(a + b) # [[11, 22, 33], [14, 25, 36]]
这里b被自动"广播"成了和a相同的形状,然后进行逐元素相加。
常用函数
在使用Numpy这一强大的科学计算库时,我们经常会用到它所提供的丰富多样的数学函数和随机数生成工具。在数学运算方面,Numpy提供了一系列高效的数组级函数,可以直接作用于整个数组而无需使用循环。我们可以创建一个一维数组:arr = np.array([1, 2, 3, 4, 5]),然后利用Numpy内置的统计函数对其进行各种操作。比如,调用np.sum(arr)可以计算数组中所有元素的总和;通过np.mean(arr)可以求得该数组的算术平均值等等。
arr = np.array([1, 2, 3, 4, 5])
print(np.sum(arr)) # 求和,15
print(np.mean(arr)) # 平均值,3.0
print(np.max(arr)) # 最大值,5
print(np.min(arr)) # 最小值,1
print(np.std(arr)) # 标准差,1.414...
print(np.exp(arr)) # 指数
print(np.log(arr)) # 自然对数
print(np.sin(arr)) # 正弦
随机数生成
Numpy的random模块可以生成各种随机数:
生成0到1之间的随机数
使用np.random.random(3)可以生成一个包含三个浮点数的一维数组,每个数都均匀分布在区间[0, 1)之间,这种随机数常用于概率模拟或权重初始化。
print(np.random.random(3)) # 3个随机数
生成标准正态分布的随机数
如果需要服从标准正态分布(均值为0,方差为1)的随机数,则可以调用np.random.randn(3),它将返回三个符合高斯分布的随机样本.
print(np.random.randn(3)) # 3个随机数
生成指定范围内的随机整数
当需要生成特定范围内的整数时,可以使用np.random.randint函数。例如,执行np.random.randint(0, 10, size=5)将会产生五个介于0到9之间的随机整数(左闭右开区间)。
print(np.random.randint(0, 10, size=5)) # 5个0-9的随机整数
随机打乱数组
此外,对于已有的数组,我们还可以通过np.random.shuffle函数实现原地打乱操作。例如,先创建一个有序数组arr = np.arange(10),即从0到9的连续整数序列,再调用np.random.shuffle(arr),即可将数组中元素的顺序完全随机化,且不返回新数组而是直接修改原数组内容,最后通过print(arr)输出打乱后的结果。
arr = np.arange(10)
np.random.shuffle(arr)
print(arr)
总结
今天咱们初步认识了Numpy这个强大的库,学习了:
-
如何创建Numpy数组
-
数组的基本操作(形状、索引、切片)
-
数组的运算和广播机制
-
常用数学函数
-
随机数生成
Numpy的功能远不止这些,但作为入门已经够用啦!下次我们会学习更高级的Numpy操作,比如矩阵运算、数组拼接、排序等等。
如果你觉得这篇文章对你有帮助,别忘了点赞收藏哦!有什么问题也可以在评论区留言,我会尽量回复大家~
3万+






