赞
踩
目录
专栏:数学建模学习笔记
pycharm专业版免费激活教程见资源
python相关库的安装:pandas,numpy,matplotlib,statsmodels
本篇属于第一卷——Numpy学习笔记
NumPy(Numerical Python)是Python编程语言的一个库,支持大规模的多维数组与矩阵运算,此外还提供了大量的数学函数库。NumPy在科学计算和数据分析领域有着广泛的应用。其核心是一个高效的多维数组对象,称为ndarray。
要使用NumPy库,首先需要安装它。可以通过pip来安装:
pip install numpy
安装完成后,可以通过以下方式导入NumPy库:
import numpy as np
NumPy的核心是ndarray对象,它是一个多维数组。它和Python的列表类似,但提供了更高效的存储和运算功能。
可以通过多种方式创建ndarray对象:
- import numpy as np
-
- # 从列表创建
- a = np.array([1, 2, 3])
- print(a) # 输出:[1 2 3]
-
- # 从嵌套列表创建
- b = np.array([[1, 2, 3], [4, 5, 6]])
- print(b) # 输出:
- # [[1 2 3]
- # [4 5 6]]
- import numpy as np
-
- # 创建全零数组
- zeros_array = np.zeros((2, 3))
- print(zeros_array) # 输出:
- # [[0. 0. 0.]
- # [0. 0. 0.]]
-
- # 创建全一数组
- ones_array = np.ones((2, 3))
- print(ones_array) # 输出:
- # [[1. 1. 1.]
- # [1. 1. 1.]]
-
- # 创建一个值为5的数组
- full_array = np.full((2, 3), 5)
- print(full_array) # 输出:
- # [[5 5 5]
- # [5 5 5]]
-
- # 创建单位矩阵
- eye_array = np.eye(3)
- print(eye_array) # 输出:
- # [[1. 0. 0.]
- # [0. 1. 0.]
- # [0. 0. 1.]]
-
- # 创建随机数组
- random_array = np.random.random((2, 3))
- print(random_array) # 输出(示例):
- #[[0.55827818 0.41537687 0.41252448]
- # [0.10251325 0.7435904 0.69922825]]
-

ndarray对象有许多属性,用于描述数组的形状、维度、数据类型等:
- import numpy as np
-
- a = np.array([[1, 2, 3], [4, 5, 6]])
-
- print("数组维度:", a.ndim) # 输出:数组维度: 2
- print("数组形状:", a.shape) # 输出:数组形状: (2, 3)
- print("数组大小:", a.size) # 输出:数组大小: 6
- print("数组数据类型:", a.dtype) # 输出:数组数据类型: int32
- print("数组元素大小:", a.itemsize) # 输出:数组元素大小: 4
- print("数组数据缓冲区:", a.data) # 输出:数组数据缓冲区: <memory at 0x000001F49D4336B0>
NumPy提供了丰富的数组运算功能,可以对ndarray对象进行数学运算、逻辑运算、统计运算等。
可以对数组进行元素级别的运算:
- import numpy as np
-
- a = np.array([1, 2, 3])
- b = np.array([4, 5, 6])
-
- # 加法
- print(a + b) # 输出:[5 7 9]
-
- # 减法
- print(a - b) # 输出:[-3 -3 -3]
-
- # 乘法
- print(a * b) # 输出:[ 4 10 18]
-
- # 除法
- print(a / b) # 输出:[0.25 0.4 0.5 ]

NumPy提供了大量的数学函数,可以对数组进行逐元素的计算:
- import numpy as np
-
- a = np.array([0, np.pi / 2, np.pi])
-
- # 三角函数
- print(np.sin(a)) # 输出:[0.000000e+00 1.000000e+00 1.224647e-16]
- print(np.cos(a)) # 输出:[ 1.000000e+00 6.123234e-17 -1.000000e+00]
- print(np.tan(a)) # 输出:[ 0.00000000e+00 1.63312394e+16 -1.22464680e-16]
-
- # 指数和对数
- print(np.exp(a)) # 输出:[ 1. 4.48168907 23.14069263]
- print(np.log(a)) # 输出:[-inf 0. 1.14472989](注:0的对数为负无穷)
- print(np.log10(a)) # 输出:[-inf 0. 0.49714987](注:0的对数为负无穷)
在使用NumPy计算数组中元素的对数时,当数组中包含零元素时,会出现“divide by zero encountered in log”或“divide by zero encountered in log10”这样的警告。这是因为对数函数在零值处无定义,对数为负无穷(-inf)。
这些警告是由零值引起的,它们在对数运算中会导致无穷大的结果。这在NumPy中是一个正常的行为,提醒你注意输入数据中的零值。
如果你想避免这些警告,可以在计算对数之前,处理数组中的零值。你可以将零值替换为一个非常小的正数,例如 np.finfo(float).eps
(浮点数的最小可表示正数),以避免这些警告。以下是一个示例代码:确保在替换零值之前,数组已经正确更新。
- import numpy as np
-
- a = np.array([0, 1, 3])
- # 替换数组中的零值为非常小的正数
- a = np.where(a == 0, np.finfo(float).eps, a)
-
- print(np.log(a)) # 输出不会包含负无穷
- print(np.log10(a)) # 输出不会包含负无穷
确保代码执行顺序正确,即先替换零值再计算对数。这段代码首先将数组 a
中的零值替换为 np.finfo(float).eps
,然后计算 a
的自然对数和常用对数,这样就不会再出现除以零的警告了。
NumPy提供了多种统计函数,可以对数组进行统计运算:
- import numpy as np
-
- a = np.array([[1, 2, 3], [4, 5, 6]])
-
- # 最小值
- print(np.min(a)) # 输出:1
-
- # 最大值
- print(np.max(a)) # 输出:6
-
- # 和
- print(np.sum(a)) # 输出:21
-
- # 均值
- print(np.mean(a)) # 输出:3.5
-
- # 标准差
- print(np.std(a)) # 输出:1.707825127659933
-
- # 中位数
- print(np.median(a)) # 输出:3.5
-
- # 累积和
- print(np.cumsum(a)) # 输出:[ 1 3 6 10 15 21]

NumPy提供了强大的数组索引与切片功能,可以方便地访问和修改数组元素。
- import numpy as np
-
- a = np.array([0, 1, 2, 3, 4, 5])
-
- # 索引
- print(a[0]) # 输出:0 输出第一个元素
- print(a[-1]) # 输出:5 输出最后一个元素
-
- # 切片
- print(a[1:3]) # 输出:[1 2] 输出第二个到第三个元素
- print(a[:3]) # 输出:[0 1 2] 输出前三个元素
- print(a[3:]) # 输出:[3 4 5] 输出第三个到最后一个元素
- print(a[::2]) # 输出:[0 2 4] 每隔一个元素输出一个元素
- import numpy as np
-
- a = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
-
- # 索引
- print(a[0, 0]) # 输出:0 输出第一行第一列的元素
- print(a[1, -1]) # 输出:5 输出第二行最后一个元素
-
- # 切片
- print(a[:2, 1:3]) # 输出:
- # [[1 2]
- # [4 5]] 输出第一行到第二行,第二列到第三列的元素
-
- print(a[::2, ::2]) # 输出:
- # [[0 2]
- # [6 8]] 每隔一行一列输出一个元素

NumPy提供了多种函数来改变数组的形状。
- import numpy as np
-
- a = np.array([[1, 2, 3], [4, 5, 6]])
-
- # 改变形状
- print(a.reshape(3, 2)) # 输出:
- # [[1 2]
- # [3 4]
- # [5 6]]
-
- print(a.flatten()) # 将数组展平成一维 输出:[1 2 3 4 5 6]
- import numpy as np
-
- a = np.array([[1, 2, 3], [4, 5, 6]])
-
- # 转置
- print(a.T) # 输出:
- # [[1 4]
- # [2 5]
- # [3 6]]
NumPy提供了拼接与分割数组的函数。
- import numpy as np
-
- a = np.array([[1, 2], [3, 4]])
- b = np.array([[5, 6]])
-
- # 垂直拼接
- print(np.vstack((a, b))) # 输出:
- # [[1 2]
- # [3 4]
- # [5 6]]
-
- # 水平拼接
- print(np.hstack((a, b.T))) # 输出:
- # [[1 2 5]
- # [3 4 6]]
- import numpy as np
-
- a = np.array([[1, 2, 3], [4, 5, 6]])
-
- # 水平分割
- print(np.hsplit(a, 3)) # 输出:[array([[1], [4]]), array([[2], [5]]), array([[3], [6]])]
-
- # 垂直分割
- print(np.vsplit(a, 2)) # 输出:[array([[1, 2, 3]]), array([[4, 5, 6]])]
NumPy的广播机制允许不同形状的数组进行算术运算。广播的规则是:
- import numpy as np
-
- a = np.array([1, 2, 3])
- b = np.array([[0], [1], [2]])
-
- # 广播机制
- print(a + b) # 输出:
- # [[1 2 3]
- # [2 3 4]
- # [3 4 5]]
NumPy提供了许多常用函数,以下列出一些常用函数的示例。
- import numpy as np
-
- # 创建全零数组
- print(np.zeros((2, 3))) # 输出:
- # [[0. 0. 0.]
- # [0. 0. 0.]]
-
- # 创建全一数组
- print(np.ones((2, 3))) # 输出:
- # [[1. 1. 1.]
- # [1. 1. 1.]]
-
- # 创建指定值数组
- print(np.full((2, 3), 5)) # 输出:
- # [[5 5 5]
- # [5 5 5]]
-
- # 创建单位矩阵
- print(np.eye(3)) # 输出:
- # [[1. 0. 0.]
- # [0. 1. 0.]
- # [0. 0. 1.]]
-
- # 创建随机数组
- print(np.random.random((2, 3))) # 输出(示例):
- # [[0.97601061 0.54150051 0.71578887]
- #[0.44954629 0.74204514 0.63492767]]
-
- # 创建等差数组
- print(np.arange(0, 10, 2)) # 输出:[0 2 4 6 8]
-
- # 创建等比数组
- print(np.linspace(0, 1, 5)) # 输出:[0. 0.25 0.5 0.75 1. ]

- import numpy as np
-
- a = np.array([1, 2, 3, 4])
-
- # 求和
- print(np.sum(a)) # 输出:10
-
- # 求乘积
- print(np.prod(a)) # 输出:24
-
- # 求累积和
- print(np.cumsum(a)) # 输出:[ 1 3 6 10]
-
- # 求累积乘积
- print(np.cumprod(a)) # 输出:[ 1 2 6 24]
NumPy提供了丰富的矩阵运算函数。
- import numpy as np
-
- a = np.array([[1, 2], [3, 4]])
- b = np.array([[5, 6], [7, 8]])
-
- # 矩阵乘法
- print(np.dot(a, b)) # 输出:
- # [[19 22]
- # [43 50]]
-
- # 矩阵行列式
- print(np.linalg.det(a)) # 输出:-2.0000000000000004
-
- # 矩阵逆
- print(np.linalg.inv(a)) # 输出:
- # [[-2. 1. ]
- # [ 1.5 -0.5]]
-
- # 矩阵特征值
- print(np.linalg.eig(a)) # 输出:(特征值,特征向量)
- # EigResult(eigenvalues=array([-0.37228132, 5.37228132]), #eigenvectors=array([[-0.82456484, -0.41597356],
- # [ 0.56576746, -0.90937671]]))

NumPy提供了多种统计运算函数。
- import numpy as np
-
- a = np.array([[1, 2, 3], [4, 5, 6]])
-
- # 均值
- print(np.mean(a)) # 输出:3.5
-
- # 中位数
- print(np.median(a)) # 输出:3.5
-
- # 方差
- print(np.var(a)) # 输出:2.9166666666666665
-
- # 标准差
- print(np.std(a)) # 输出:1.707825127659933
-
- # 最小值
- print(np.min(a)) # 输出:1
-
- # 最大值
- print(np.max(a)) # 输出:6
-
- # 百分位数
- print(np.percentile(a, 50)) # 输出:3.5

以下是一个简单的数据分析案例,展示如何使用NumPy进行数据处理和分析。
- import numpy as np
-
- # 生成模拟数据
- data = np.random.randn(1000)
-
- # 计算均值和标准差
- mean = np.mean(data)
- std_dev = np.std(data)
-
- print(f"均值: {mean}, 标准差: {std_dev}") # 示例输出:均值: -0.015971063944354425, 标准差: 0.9670869531250885
- # 计算数据的直方图
- hist, bin_edges = np.histogram(data, bins=10)
- print(hist) # 示例输出:[ 4 8 53 101 227 251 204 111 34 7]
- print(bin_edges) # 示例输出:[-3.42803477 -2.79654529 -2.16505581 -1.53356634 -0.90207686 -0.27058738
- # 0.36090209 0.99239157 1.62388104 2.25537052 2.88686 ]
以下是一个简单的数值计算案例,展示如何使用NumPy进行数值计算。
- import numpy as np
-
- # 定义函数
- def f(x):
- return x**2 - 4*x + 4
-
- # 生成数据
- x = np.linspace(-10, 10, 100)
-
- # 计算函数值
- y = f(x)
-
- print(y)
- """
- 示例输出:
- [1.44000000e+02 1.39192327e+02 1.34466279e+02 1.29821855e+02
- 1.25259055e+02 1.20777880e+02 1.16378329e+02 1.12060402e+02
- 1.07824100e+02 1.03669421e+02 9.95963677e+01 9.56049383e+01
- 9.16951331e+01 8.78669524e+01 8.41203959e+01 8.04554637e+01
- 7.68721559e+01 7.33704724e+01 6.99504132e+01 6.66119784e+01
- 6.33551678e+01 6.01799816e+01 5.70864198e+01 5.40744822e+01
- 5.11441690e+01 4.82954801e+01 4.55284155e+01 4.28429752e+01
- 4.02391593e+01 3.77169677e+01 3.52764004e+01 3.29174574e+01
- 3.06401388e+01 2.84444444e+01 2.63303745e+01 2.42979288e+01
- 2.23471074e+01 2.04779104e+01 1.86903377e+01 1.69843893e+01
- 1.53600653e+01 1.38173656e+01 1.23562902e+01 1.09768391e+01
- 9.67901235e+00 8.46280992e+00 7.32823181e+00 6.27527803e+00
- 5.30394858e+00 4.41424344e+00 3.60616264e+00 2.87970615e+00
- 2.23487399e+00 1.67166616e+00 1.19008264e+00 7.90123457e-01
- 4.71788593e-01 2.35078053e-01 7.99918376e-02 6.52994592e-03
- 1.46923783e-02 1.04479135e-01 2.75890215e-01 5.28925620e-01
- 8.63585348e-01 1.27986940e+00 1.77777778e+00 2.35731048e+00
- 3.01846750e+00 3.76124885e+00 4.58565453e+00 5.49168452e+00
- 6.47933884e+00 7.54861749e+00 8.69952046e+00 9.93204775e+00
- 1.12461994e+01 1.26419753e+01 1.41193756e+01 1.56784002e+01
- 1.73190491e+01 1.90413223e+01 2.08452199e+01 2.27307418e+01
- 2.46978880e+01 2.67466585e+01 2.88770534e+01 3.10890725e+01
- 3.33827160e+01 3.57579839e+01 3.82148760e+01 4.07533925e+01
- 4.33735333e+01 4.60752984e+01 4.88586879e+01 5.17237017e+01
- 5.46703398e+01 5.76986022e+01 6.08084889e+01 6.40000000e+01]
- """

NumPy通常与其他库结合使用,如Pandas、Matplotlib、SciPy等。以下是一个简单的示例,展示如何结合NumPy和Matplotlib进行数据可视化。
- import numpy as np
- import matplotlib.pyplot as plt
-
- # 生成数据
- x = np.linspace(0, 10, 100)
- y = np.sin(x)
-
- # 绘制数据
- plt.plot(x, y)
- plt.xlabel('x')
- plt.ylabel('sin(x)')
- plt.title('Sin(x) Function')
- plt.show()
运行结果: 一幅展示sin(x)函数的折线图,其中x轴表示从0到10的均匀分布的数据,y轴表示sin(x)的值。
NumPy提供了丰富的线性代数功能,可以进行矩阵乘法、矩阵分解、特征值计算等。
- import numpy as np
-
- a = np.array([[1, 2], [3, 4]])
- b = np.array([[5, 6], [7, 8]])
-
- # 矩阵乘法
- print(np.dot(a, b)) # 输出:
- # [[19 22]
- # [43 50]]
-
- # 矩阵行列式
- print(np.linalg.det(a)) # 输出:-2.0000000000000004
-
- # 矩阵逆
- print(np.linalg.inv(a)) # 输出:
- # [[-2. 1. ]
- # [ 1.5 -0.5]]
-
- # 矩阵特征值
- print(np.linalg.eig(a)) # 输出:(特征值,特征向量)
- # (array([-0.37228132, 5.37228132]),
- # array([[-0.82456484, -0.41597356],
- # [ 0.56576746, -0.90937671]]))

NumPy提供了丰富的随机数生成功能,可以生成各种分布的随机数。
- import numpy as np
-
- # 生成均匀分布的随机数
- print(np.random.rand(2, 3)) # 输出(示例):
- # [[0.2177449 0.71579651 0.40282945]
- # [0.00823481 0.2378211 0.22714768]]
-
- # 生成标准正态分布的随机数
- print(np.random.randn(2, 3)) # 输出(示例):
- # [[-0.02638322 -0.29821612 -0.57163728]
- # [ 0.023793 -0.03624107 0.5007041 ]]
-
- # 生成指定区间的随机整数
- print(np.random.randint(0, 10, size=(2, 3))) # 输出(示例):
- # [[9 0 6]
- # [4 5 5]]
- # 生成指定分布的随机数
- print(np.random.normal(loc=0, scale=1, size=(2, 3))) # 输出(示例):
- #[[-0.05426652 0.00228263 -0.27759785]
- #[-0.47845462 2.04304079 -0.84451445]]

NumPy提供了快速傅里叶变换功能,可以对数组进行快速傅里叶变换。
- import numpy as np
-
- a = np.array([0, 1, 2, 3])
-
- # 快速傅里叶变换
- print(np.fft.fft(a)) # 输出:
- # [ 6.+0.j -2.+2.j -2.+0.j -2.-2.j]
-
- # 逆快速傅里叶变换
- print(np.fft.ifft(a)) # 输出:
- # [ 1.5+0.j -0.5+0.5j -0.5+0.j -0.5-0.5j]
NumPy通过其底层实现,已经大大优化了性能,但在实际应用中仍有许多技巧可以进一步提升性能。
尽量使用向量化操作代替显式的Python循环,以提高性能。
- import numpy as np
-
- a = np.arange(1000000)
-
- # 使用向量化操作
- result = a * 2
- print(result[:10]) # 输出:[ 0 2 4 6 8 10 12 14 16 18]
在操作大数组时,尽量避免不必要的数组复制操作,以减少内存使用和提高性能。
- import numpy as np
-
- a = np.arange(1000000)
-
- # 避免不必要的复制
- b = a[:500000]
- print(b[:10]) # 输出:[0 1 2 3 4 5 6 7 8 9]
本文通过详细的讲解和丰富的代码示例,全面介绍了NumPy库的基础知识、常用功能和高级应用,为初学者提供了深入理解和灵活使用NumPy的指南。
NumPy(Numerical Python)是Python编程语言的一个库,专门用于大规模的多维数组与矩阵运算。NumPy是科学计算和数据分析的重要工具,其核心是高效的多维数组对象ndarray。
通过pip可以轻松安装NumPy库,导入方式为 import numpy as np
。
ndarray对象是NumPy的核心,可以通过列表、元组或内置函数创建。ndarray具有多种属性,如维度、形状、大小、数据类型等,方便用户对数组进行描述和操作。
NumPy提供了丰富的运算功能,包括基本运算、数学函数和统计函数。用户可以对数组进行元素级别的加减乘除运算,使用三角函数、指数和对数函数进行复杂计算,还可以进行求和、均值、标准差等统计运算。
NumPy的索引与切片功能强大,可以方便地访问和修改数组元素。支持一维和多维数组的索引和切片操作,使得数据操作更加灵活。
NumPy提供了改变数组形状的多种函数,如reshape、flatten和转置函数,使得用户可以轻松调整数组的结构以满足不同的计算需求。
NumPy支持数组的拼接与分割操作,用户可以使用vstack和hstack进行垂直和水平拼接,使用hsplit和vsplit进行数组分割。
广播机制允许不同形状的数组进行算术运算,极大地方便了数组的操作和计算。理解广播机制的规则有助于更有效地使用NumPy进行数组运算。
NumPy提供了多种常用函数,如创建全零数组、全一数组、单位矩阵、随机数组,以及生成等差和等比数组的函数。这些函数简化了数组的生成过程。
NumPy的高级运算功能包括矩阵运算和统计运算,支持矩阵乘法、行列式、矩阵逆和特征值计算,提供了丰富的统计函数,如均值、中位数、方差和标准差等。
本文通过数据分析和数值计算的实际案例,展示了如何使用NumPy进行数据处理和分析,以及进行数值计算,帮助读者将理论知识应用于实践。
NumPy通常与Pandas、Matplotlib、SciPy等库结合使用。本文展示了如何结合NumPy和Matplotlib进行数据可视化,进一步扩展了NumPy的应用范围。
NumPy提供了线性代数、随机数生成和快速傅里叶变换等高级功能,使得其在科学计算和工程应用中更加得心应手。
通过向量化操作和避免不必要的复制,用户可以进一步优化NumPy的性能,提升代码运行效率。
NumPy作为Python科学计算的基础库,提供了强大的数组处理能力和丰富的数学函数,广泛应用于数据分析、科学计算、工程应用等领域。通过本篇详细的介绍和示例,读者可以全面掌握NumPy的使用方法,并在实际项目中灵活应用,从而大幅提升计算效率和编程体验。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。