Python NumPy学习指南
第一部分:NumPy简介与安装
1. 什么是NumPy?
NumPy,即Numerical Python,是Python中最为常用的科学计算库之一。它提供了强大的多维数组对象ndarray
,并支持大量的数学函数和操作。与Python内置的列表相比,NumPy数组的计算速度更快,占用内存更少,非常适合处理大量的数据。
NumPy的功能不仅限于数值计算,它还支持复杂的数组操作,如切片、索引、线性代数运算等。NumPy通常与SciPy、Pandas等其他科学计算库一起使用,构成了Python科学计算的基础生态。
2. 安装NumPy
在开始使用NumPy之前,我们需要在Python环境中安装它。可以通过以下两种方式进行安装:
使用pip安装:
打开命令行终端,输入以下命令:
pip install numpy
使用Anaconda安装:
如果你使用的是Anaconda环境,可以使用以下命令:
conda install numpy
安装完成后,可以通过以下命令验证是否安装成功:
import numpy as np print(np.__version__)
成功安装后,终端将输出NumPy的版本号。
第二部分:NumPy数组基础
1. NumPy数组的创建
NumPy数组是NumPy的核心数据结构。你可以通过多种方式来创建NumPy数组:
从列表创建一维数组:
import numpy as np my_list = [1, 2, 3, 4, 5] np_array = np.array(my_list) print(np_array)
输出:
[1 2 3 4 5]
在这个例子中,我们从一个Python列表创建了一个一维的NumPy数组。
创建多维数组:
my_matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] np_matrix = np.array(my_matrix) print(np_matrix)
输出:
[[1 2 3] [4 5 6] [7 8 9]]
这里,我们创建了一个二维数组,它包含三个子列表,每个子列表代表矩阵的一行。
使用NumPy内置函数创建数组:
NumPy提供了许多内置函数来创建数组:
np_zeros = np.zeros((3, 3)) np_ones = np.ones((2, 4)) np_eye = np.eye(3) print("Zeros Array:\n", np_zeros) print("Ones Array:\n", np_ones) print("Identity Matrix:\n", np_eye)
输出:
Zeros Array: [[0. 0. 0.] [0. 0. 0.] [0. 0. 0.]] Ones Array: [[1. 1. 1. 1.] [1. 1. 1. 1.]] Identity Matrix: [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]]
以上例子分别展示了如何创建全零矩阵、全一矩阵以及单位矩阵。
2. NumPy数组的属性
理解NumPy数组的属性有助于更好地操作和利用这些数组。以下是一些常用的属性:
数组的维度(ndim
):
print(np_matrix.ndim)
输出:
2
该属性返回数组的维度。对于二维数组,返回值为2。
数组的形状(shape
):
print(np_matrix.shape)
输出:
(3, 3)
shape
属性返回一个元组,表示数组的维度大小。对于一个3x3的矩阵,它返回(3, 3)
。
数组的元素个数(size
):
print(np_matrix.size)
输出:
9
size
属性返回数组中元素的总个数。
数组元素的数据类型(dtype
):
print(np_matrix.dtype)
输出:
int64
dtype
属性显示数组中元素的数据类型。在这个例子中,数组元素的数据类型为64位整数。
3. NumPy数组的索引与切片
类似于Python列表,NumPy数组也支持索引和切片操作,可以方便地访问和修改数组中的元素。
一维数组的索引:
arr = np.array([10, 20, 30, 40, 50]) print(arr[1]) # 访问第二个元素
输出:
20
二维数组的索引:
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(matrix[1, 2]) # 访问第二行第三列的元素
输出:
6
数组切片:
print(arr[1:4]) # 获取第二个到第四个元素的子数组
输出:
[20 30 40]
数组切片操作返回一个新的数组,该数组包含原始数组的一个子集。
第三部分:NumPy数组操作
1. NumPy数组的索引与切片(进阶)
在之前的基础部分,我们已经了解了一维和二维数组的基本索引与切片操作。接下来,我们将深入探讨更多高级的索引与切片技巧,这些技巧能帮助我们更灵活地操作数组数据。
布尔索引
布尔索引用于基于条件来选择数组中的元素。这对于筛选满足特定条件的元素非常有用。
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) bool_idx = arr > 5 print(bool_idx)
输出:
[False False False False False True True True True True]
可以看到,bool_idx
是一个布尔数组,表示哪些元素满足arr > 5
这个条件。我们可以用这个布尔数组直接索引原数组:
print(arr[bool_idx])
输出:
[ 6 7 8 9 10]
花式索引
花式索引允许我们使用数组或列表来指定索引顺序,从而按特定顺序选择数组中的元素。
arr = np.array([10, 20, 30, 40, 50]) indices = [0, 3, 4] print(arr[indices])
输出:
[10 40 50]
多维数组的切片
对于多维数组,切片操作可以同时作用于多个维度。
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(matrix[:2, 1:3]) # 获取前两行中第二列和第三列的子数组
输出:
[[2 3] [5 6]]
在这个例子中,我们使用了两个切片,第一个切片[:2]
表示选择前两行,第二个切片[1:3]
表示选择第二列和第三列。
2. NumPy数组的形状变换
有时我们需要对数组的形状进行变换,比如将一维数组转换为二维数组,或者将多维数组展平成一维数组。NumPy提供了多种方法来进行形状变换。
reshape
reshape
方法可以改变数组的形状而不改变数据内容。
arr = np.array([1, 2, 3, 4, 5, 6]) reshaped_arr = arr.reshape((2, 3)) print(reshaped_arr)
输出:
[[1 2 3] [4 5 6]]
这里,我们将一个一维的数组转换为一个2x3的二维数组。
ravel
ravel
方法将多维数组展平成一维数组。
matrix = np.array([[1, 2, 3], [4, 5, 6]]) flattened = matrix.ravel() print(flattened)
输出:
[1 2 3 4 5 6]
transpose
transpose
方法用于矩阵的转置操作,交换数组的维度。
matrix = np.array([[1, 2, 3], [4, 5, 6]]) transposed = matrix.transpose() print(transposed)
输出:
[[1 4] [2 5] [3 6]]
3. 数组间的运算
NumPy的强大之处在于它可以对数组进行高效的元素级运算。这使得大量数据的计算变得非常高效。
数组的算术运算
NumPy支持基本的算术运算,这些运算都是元素级别的。
arr1 = np.array([1, 2, 3]) arr2 = np.array([4, 5, 6]) # 加法 print(arr1 + arr2) # 乘法 print(arr1 * arr2)
输出:
[5 7 9] [ 4 10 18]
数组与标量的运算
NumPy也支持数组与标量之间的运算,这同样是元素级别的。
arr = np.array([1, 2, 3]) print(arr * 2)
输出:
[2 4 6]
广播机制
广播是NumPy的一个强大特性,它允许对形状不同的数组进行算术运算。NumPy会自动扩展较小的数组,使得它们的形状兼容,从而完成运算。
arr1 = np.array([[1, 2, 3], [4, 5, 6]]) arr2 = np.array([1, 0, 1]) print(arr1 + arr2)
输出:
[[2 2 4] [5 5 7]]
在这个例子中,arr2
的形状为(3,),它被广播为(2, 3)的形状,从而与arr1
进行加法运算。
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧2:https://developer.aliyun.com/article/1617471