NumPy(Numerical Python)是一个开源的Python库,用于科学计算。它提供了一个高性能的多维数组对象和用于处理这些数组的工具。NumPy是Python科学计算的基础库,被广泛用于数据分析、机器学习、科学计算等领域。
1.1 NumPy 概述
NumPy是Python的一个扩展库,主要用于处理大型多维数组和矩阵,提供了丰富的数学函数库。NumPy的核心是ndarray(N-dimensional array)对象,它可以存储不同类型的数据,并且提供了许多操作符和函数,使得对数组的操作变得非常方便。NumPy的数组运算比Python内置的列表运算要快得多,因为NumPy的数组运算是在底层使用C语言实现的。
NumPy提供了以下主要功能:
- 高性能的多维数组对象(ndarray),用于存储和处理大型数据集。
- 用于对数组进行快速运算的数学函数库。
- 用于读写硬盘上数据的工具。
- 线性代数、傅里叶变换、随机数生成等常用科学计算功能。
NumPy是许多高级Python科学计算库的基础,如Pandas、SciPy、Matplotlib等,因此学习NumPy对于进行科学计算和数据分析非常重要。
1.2 安装配置
NumPy的安装相对简单,有多种方法可以安装NumPy,包括使用pip、conda等包管理器,或者从源代码编译安装。以下是一些常见的安装方法:
使用pip安装
pip是Python的包管理器,可以通过以下命令安装NumPy:
pip install numpy
如果你需要安装特定的版本,可以使用下面的命令:
pip install numpy==1.18.5 # 替换为想要安装的版本号
使用conda安装
如果你使用Anaconda或Miniconda,可以使用conda命令来安装NumPy:
conda install numpy
同样,如果需要安装特定版本,可以指定版本号:
conda install numpy=1.18.5 # 替换为想要安装的版本号
从源代码安装
如果你想从源代码编译安装NumPy,可以从NumPy的GitHub仓库克隆源代码,然后编译安装:
git clone https://github.com/numpy/numpy.git
cd numpy
python setup.py build
python setup.py install
验证安装
安装完成后,可以在Python解释器中导入NumPy模块来验证安装是否成功:
import numpy as np
print(np.__version__)
如果上述代码没有报错,并且打印出了NumPy的版本号,那么说明NumPy已经成功安装。
环境配置
NumPy需要Python环境,因此在安装NumPy之前,请确保你的系统中已经安装了Python。NumPy兼容的Python版本通常包括最新版的Python 3以及一些较旧版本。在撰写本文时,NumPy兼容的Python 3版本通常是3.6或更高版本。
此外,NumPy的某些功能可能需要依赖其他库,如BLAS(Basic Linear Algebra Subprograms)库,这些依赖通常在安装NumPy时会自动处理。
总的来说,NumPy的安装配置过程相对简单,大多数情况下只需要使用pip或conda命令即可轻松完成安装。
1.3 创建数组
NumPy提供了一个强大的数组对象,即ndarray
(N-dimensional array),用于存储多维数据。在NumPy中,创建数组有多种方法。
使用numpy.array
直接创建
你可以使用numpy.array
函数直接从Python列表或元组创建一个NumPy数组:
import numpy as np
# 从Python列表创建一维数组
arr1 = np.array([1, 2, 3, 4, 5])
# 从Python列表创建二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
# 从Python元组创建一维数组
arr3 = np.array((1, 2, 3, 4, 5))
使用numpy.zeros
创建全零数组
numpy.zeros
函数可以创建一个指定形状和数据类型的新数组,并将其所有元素初始化为0:
# 创建一个长度为3的一维全零数组
zeros1 = np.zeros(3)
# 创建一个2x3的二维全零数组
zeros2 = np.zeros((2, 3))
# 创建一个3x3的二维全零数组,数据类型为整数
zeros3 = np.zeros((3, 3), dtype=int)
使用numpy.ones
创建全一数组
与numpy.zeros
类似,numpy.ones
函数可以创建一个指定形状和数据类型的新数组,并将其所有元素初始化为1:
# 创建一个长度为3的一维全一数组
ones1 = np.ones(3)
# 创建一个2x3的二维全一数组
ones2 = np.ones((2, 3))
# 创建一个3x3的二维全一数组,数据类型为浮点数
ones3 = np.ones((3, 3), dtype=float)
使用numpy.arange
创建序列数组
numpy.arange
函数用于创建一个指定范围内的等差数列数组:
# 创建一个从0到9的一维数组
arange1 = np.arange(10)
# 创建一个从1到9的一维数组
arange2 = np.arange(1, 10)
# 创建一个从1到9,步长为2的一维数组
arange3 = np.arange(1, 10, 2)
使用numpy.linspace
创建等间隔数组
numpy.linspace
函数用于创建一个在指定开始值和结束值之间均匀间隔的数组:
# 创建一个从0到10的5个元素的等间隔一维数组
linspace1 = np.linspace(0, 10, 5)
# 创建一个从1到5的4个元素的等间隔一维数组
linspace2 = np.linspace(1, 5, 4)
使用numpy.eye
创建单位矩阵
numpy.eye
函数用于创建一个单位矩阵(对角线元素为1,其他元素为0):
# 创建一个3x3的单位矩阵
eye = np.eye(3)
使用numpy.diag
创建对角矩阵
numpy.diag
函数用于创建一个对角矩阵,或者从现有数组中提取对角线元素:
# 创建一个对角线为[1, 2, 3]的对角矩阵
diag = np.diag([1, 2, 3])
# 从二维数组中提取对角线元素
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
diag_elements = np.diag(arr)
这些是创建NumPy数组的一些基本方法。NumPy提供了丰富的函数来创建和操作数组,这些数组是进行科学计算和数据分析的基础。
1.4 操作数组
NumPy提供了丰富的操作符和函数来操作数组。这些操作包括数组的基本运算、形状变换、切片和索引等。
基本运算
NumPy数组支持常见的数学运算,如加法、减法、乘法、除法和幂运算。这些运算可以应用于标量(单个数字)与数组之间,也可以应用于两个形状相同的数组之间。
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
# 加法
c = a + b # array([5, 7, 9])
# 减法
d = a - b # array([-3, -3, -3])
# 乘法
e = a * b # array([ 4, 10, 18])
# 除法
f = a / b # array([0.25, 0.4 , 0.5 ])
# 幂运算
g = a ** 2 # array([1, 4, 9])
形状变换
NumPy数组有一个重要的属性shape
,它表示数组的维度。你可以使用reshape
方法来改变数组的形状,只要新的形状的元素数量与原始数组相同。
a = np.array([1, 2, 3, 4, 5, 6])
# 将一维数组重塑为二维数组
b = a.reshape((2, 3)) # array([[1, 2, 3],
# [4, 5, 6]])
# 将二维数组重塑为一维数组
c = b.reshape((6,)) # array([1, 2, 3, 4, 5, 6])
切片和索引
NumPy数组可以使用切片语法进行索引和切片,这与Python列表的切片操作类似。
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 获取第二行
row = a[1] # array([4, 5, 6])
# 获取第一列
col = a[:, 0] # array([1, 4, 7])
# 获取第一行和第二列的元素
element = a[0, 1] # 2
# 切片,获取第二行第二列的元素
slice_element = a[1:2, 1:3] # array([[5, 6]])
其他操作
NumPy还提供了许多其他操作,如数组的堆叠、分割、转置等。
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
# 垂直堆叠
v_stack = np.vstack((a, b)) # array([[1, 2],
# [3, 4],
# [5, 6],
# [7, 8]])
# 水平堆叠
h_stack = np.hstack((a, b)) # array([[1, 2, 5, 6],
# [3, 4, 7, 8]])
# 转置
transpose = a.T # array([[1, 3],
# [2, 4]])
# 平铺数组
ravel = a.ravel() # array([1, 2, 3, 4])
这些操作是NumPy中进行数据操作的基础,它们使得处理大型数据集变得更加高效和方便。
1.5 常用函数
NumPy提供了大量的函数来处理数组,这些函数覆盖了从基本的数学运算到高级的统计和线性代数操作。以下是一些常用的NumPy函数:
数学函数
import numpy as np
a = np.array([1, 2, 3, 4, 5])
# 计算平方根
sqrt_a = np.sqrt(a) # array([1. , 1.41421356, 1.73205081, 2. , 2.23606798])
# 计算指数(e的a次幂)
exp_a = np.exp(a) # array([ 2.71828183, 7.3890561 , 20.08553692, 54.59815003, 148.4131591 ])
# 计算自然对数
log_a = np.log(a) # array([0. , 0.69314718, 1.09861229, 1.38629436, 1.60943791])
# 计算a的b次幂
power_a = np.power(a, 3) # array([ 1, 8, 27, 64, 125])
统计函数
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 计算均值
mean_a = np.mean(a) # 5.0
# 计算中位数
median_a = np.median(a) # 5.0
# 计算标准差
std_a = np.std(a) # 2.581988897471611
# 计算方差
var_a = np.var(a) # 6.666666666666667
# 沿指定轴计算最大值
max_a = np.max(a, axis=0) # array([7, 8, 9])
# 沿指定轴计算最小值
min_a = np.min(a, axis=1) # array([1, 4, 7])
线性代数函数
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
# 计算矩阵的点积
dot_product = np.dot(a, b) # array([[19, 22],
# [43, 50]])
# 计算矩阵的行列式
det_a = np.linalg.det(a) # -2.0
# 计算矩阵的逆
inv_a = np.linalg.inv(a) # array([[-2. , 1. ],
# [ 1.5, -0.5]])
# 计算矩阵的特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(a)
排序和搜索函数
a = np.array([3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5])
# 对数组进行排序
sorted_a = np.sort(a) # array([1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9])
# 查找数组的唯一元素
unique_a = np.unique(a) # array([1, 2, 3, 4, 5, 6, 9])
# 查找最小元素的索引
argmin_a = np.argmin(a) # 1
# 查找最大元素的索引
argmax_a = np.argmax(a) # 10
# 搜索特定值的位置
where_a = np.where(a == 5) # (array([4, 7, 9], dtype=int64),)
这些函数只是NumPy提供的众多函数中的一小部分。NumPy的函数库非常丰富,可以满足各种科学计算和数据分析的需求。
1.6 掩码数组
掩码数组(Masked Array)是NumPy中的一个特殊类型,用于处理包含缺失值或无效数据的数组。掩码数组允许你标记数组中的某些元素为“掩蔽”或“隐藏”,这样在计算和操作数组时可以忽略这些元素。
创建掩码数组
可以使用numpy.ma
模块中的masked_array
函数来创建掩码数组。掩码数组通常由数据、掩码和填充值三部分组成。
import numpy as np
import numpy.ma as ma
# 创建一个包含缺失值的普通数组
data = np.array([1, 2, np.nan, 4, 5])
# 创建一个掩码数组,将NaN值掩蔽
mask = np.isnan(data)
masked_array = ma.masked_array(data, mask=mask)
print(masked_array)
# [1.0 2.0 -- 4.0 5.0]
# '--' 表示被掩蔽的元素
掩码数组的操作
掩码数组的行为在很多方面与普通数组相似,但是在计算时会自动忽略被掩蔽的元素。
# 对掩码数组进行计算
print(masked_array.mean())
# 3.0
# 掩蔽数组也可以进行切片和索引
print(masked_array[1:4])
# [2.0 -- 4.0]
掩码数组的填充值
掩码数组可以指定一个填充值(fill value),这个值通常用于在输出中被掩蔽的元素位置上显示一个特定的值。
# 创建一个掩码数组,指定填充值为-999
masked_array_with_fill = ma.masked_array(data, mask=mask, fill_value=-999)
print(masked_array_with_fill)
# [1.0 2.0 -999.0 4.0 5.0]
掩码数组的掩蔽操作
可以使用掩码数组的mask
属性来直接操作掩蔽。
# 掩蔽所有大于3的元素
masked_array.mask = masked_array > 3
print(masked_array)
# [1.0 2.0 -- -- 5.0]
掩码数组是处理不完整或含有错误数据的有效工具。通过使用掩码数组,可以在数据分析过程中轻松地处理缺失数据,而不必删除这些数据或手动处理。
1.7 矩阵对象
NumPy提供了一个专门的矩阵对象,即numpy.matrix
,用于线性代数中的矩阵操作。矩阵是一个二维数组,但它与NumPy的常规二维数组(numpy.ndarray
)有一些不同的属性和行为。矩阵运算通常遵循线性代数的规则,例如矩阵乘法默认为按元素乘法。
创建矩阵
可以使用numpy.matrix
函数或numpy.asmatrix
函数来创建矩阵。
import numpy as np
# 使用numpy.matrix创建矩阵
A = np.matrix([[1, 2], [3, 4]])
# 使用numpy.asmatrix将现有数组转换为矩阵
B = np.asmatrix([[5, 6], [7, 8]])
print(A)
# [[1 2]
# [3 4]]
print(B)
# [[5 6]
# [7 8]]
矩阵的索引和切片
矩阵的索引和切片与二维数组相似,但是矩阵的切片会返回矩阵对象。
# 获取矩阵中的元素
element = A[0, 1] # 2
# 获取矩阵的行和列
row = A[0] # [[1 2]]
column = A[:, 1] # [[2]
# [4]]
矩阵运算
矩阵支持常见的线性代数运算,如矩阵乘法、求逆、求行列式等。
# 矩阵乘法
C = A * B
print(C)
# [[19 22]
# [43 50]]
# 矩阵求逆
A_inv = A.I
print(A_inv)
# [[-2. 1. ]
# [ 1.5 -0.5]]
# 矩阵求行列式
det_A = A.A
print(det_A)
# -2.0
矩阵与数组的转换
可以使用numpy.array
函数将矩阵转换为普通的NumPy数组,也可以使用numpy.asmatrix
将数组转换为矩阵。
# 矩阵转换为数组
A_array = np.array(A)
# 数组转换为矩阵
A_matrix = np.asmatrix(A_array)
尽管numpy.matrix
提供了方便的矩阵操作,但在大多数情况下,推荐使用numpy.ndarray
进行数组操作,因为numpy.ndarray
更加灵活和通用。numpy.matrix
在某些情况下可能会导致混淆,特别是当涉及到矩阵和数组的混合操作时。
1.8 随机抽样子模块
NumPy的随机抽样子模块numpy.random
提供了用于生成随机数的函数,这些函数对于模拟和随机数据分析非常有用。以下是一些常用的随机抽样函数:
均匀分布
import numpy as np
# 生成一个[0, 1)区间内的均匀分布随机数
random_float = np.random.rand()
# 生成一个5x5的矩阵,其元素从[0, 1)区间内均匀分布
random_matrix = np.random.rand(5, 5)
正态分布
# 生成一个服从标准正态分布(均值为0,标准差为1)的随机数
random_normal = np.random.randn()
# 生成一个5x5的矩阵,其元素服从标准正态分布
random_normal_matrix = np.random.randn(5, 5)
# 生成一个服从指定均值和标准差的正态分布的随机数
mean = 0
std_dev = 1
random_normal_custom = np.random.normal(mean, std_dev)
整数随机抽样
# 生成一个从0到9的随机整数
random_int = np.random.randint(0, 10)
# 生成一个5x5的矩阵,其元素从0到9的随机整数
random_int_matrix = np.random.randint(0, 10, size=(5, 5))
从序列中随机选择
# 随机从给定的列表中选取一个元素
random_choice = np.random.choice(['apple', 'banana', 'cherry'])
# 随机从给定的数组中选取3个元素
random_choices = np.random.choice([1, 2, 3, 4, 5], size=3)
随机打乱顺序
# 创建一个数组并打乱其顺序
arr = np.array([1, 2, 3, 4, 5])
np.random.shuffle(arr)
设置随机种子
为了可重复的实验,可以设置随机种子。
# 设置随机种子
np.random.seed(0)
# 生成随机数
random_numbers = np.random.rand(5)
设置随机种子后,每次运行代码生成的随机数序列将会相同。如果不设置种子,则每次运行代码时都会生成不同的随机数序列。
NumPy的随机抽样子模块提供了丰富的函数来生成不同分布的随机数,这些函数在统计模拟、机器学习算法和数据生成中非常有用。