python科学计算


一、科学计算介绍

python语言提供了array模块,与列表不同,array能直接保存数据,和C语言的一维数组类似;但由于array模块不支持多维数组,也没有各种运算函数,因此它不适合做数值运算。

Python具有丰富的库和工具,可以用于处理各种数学、科学和工程问题。以下是一些常用的Python科学计算库:

  • NumPy(Numerical Python):提供了高性能的多维数组对象和用于处理数组的工具。
  • SciPy(Scientific Python):基于NumPy,提供了许多科学计算功能,如线性代数、优化、积分等。
  • pandas:提供了数据处理和分析的功能,如数据清洗、数据转换、数据聚合等。
  • Matplotlib:用于绘制图表和可视化数据的库。
  • Jupyter Notebook:交互式编程环境,可以方便地编写和共享代码。

二、NumPy

2.1、NumPy是什么

NumPy是一个用于科学计算的Python库,它提供了多维数组对象、数学函数库以及整合C/C++/Fortran代码的工具。

NumPy的核心是ndarray对象,该对象封装了n维同类数组。与Python标准序列不同,NumPy数组在创建时有固定大小,且数组中的元素必须是同一数据类型。

2.2、NumPy使用场景

  • 科学计算:
    • 线性代数运算,如矩阵乘法、求逆和特征值分解。
    • 微分和积分计算,用于求解复杂数学问题。
    • 信号处理,例如傅里叶变换和滤波器设计。
  • 机器学习:
    • 神经网络构建,利用NumPy进行高效的矩阵运算。
    • 数据预处理,包括归一化和标准化操作。
    • 实现各种机器学习算法,如支持向量机和K近邻算法。
  • 图像处理:
    • 图像的读取、写入和显示,以及基本的图像转换操作。
    • 图像滤波和增强,如平滑和锐化处理。
    • 高级图像分析,例如边缘检测和目标识别。
  • 数据分析:
    • 数据清洗和转换,确保数据质量。
    • 统计分析,包括均值、标准差和协方差计算。
    • 数据可视化,结合Matplotlib生成图表。
  • 金融工程:
    • 模拟金融市场数据,如股票价格和收益率。
    • 风险管理,计算VaR和其他金融指标。
    • 资产定价模型的构建和测试。
  • 工程仿真:
    • 有限元分析和流体动力学模拟。
    • 优化问题的求解,如结构设计和参数调整。
    • 高性能计算,通过并行化提高计算效率。

2.3、NumPy特点

  • 多维数组对象:NumPy的核心数据结构是ndarray,它是一个多维数组,用于存储同质数据类型的元素。这种多维数组非常适合向量化操作和矩阵运算,可以是一维、二维、三维等。
  • 广播功能:NumPy允许在不同形状的数组之间执行操作,通过广播机制,它能够自动调整数组的形状以使操作有效。这项功能极大地增强了NumPy的灵活性和计算效率,避免了手动编写循环的繁琐工作。
  • 丰富的数学函数库:NumPy提供了大量的数学、统计和线性代数函数,包括基本的加减乘除、三角函数、指数和对数函数、随机数生成以及矩阵操作等。这些函数极大地方便了各种科学计算任务的实现。
  • 高性能计算:NumPy的底层实现是用C语言编写的,因此在处理大规模数据时非常高效。与其他高性能计算库如BLAS和LAPACK集成,提供了快速的线性代数运算。由于释放了Python的GIL(全局解释器锁),NumPy在进行数组操作时可以实现并行计算。
  • 互操作性:NumPy可以与许多其他Python库和数据格式无缝集成,例如Pandas、SciPy和Matplotlib等。这使得数据科学工作流更加流畅,从而为数据分析人员、科学家和工程师提供了一个功能强大且高效的工具。

2.4、NumPy如何使用

  • 安装NumPy:
    • 通过Anaconda终端安装是较为便捷的一种方式。打开Anaconda终端,创建一个新的虚拟环境(例如名为NumpyTest),激活该环境,然后使用pip install numpy命令进行安装。
      对于网络问题导致的安装困难,可以考虑切换至国内镜像源,如清华园镜像。
  • 创建数组:
    • 一维数组可以通过np.array([1, 2, 3, 4])的方式创建。这会生成一个包含这些元素的数组。
    • 二维数组或矩阵的创建方式类似,如np.array([[1, 2, 3], [4, 5, 6]])会生成一个2x3的矩阵。
    • np.zeros((5, 3))会创建一个5行3列、所有元素为0的数组。
    • 相反,np.ones((5, 3))会创建一个所有元素为1的同样维度的数组。
    • np.empty((5, 3))则创建一个所有元素初始值为无限小(接近于0)的数组。
    • np.arange(10, 16, 2)会生成一个从10到14(不包括16),步长为2的数组。
    • np.linspace(1, 10, 20)则会在1到10之间均匀地生成20个数值组成的数组。
    • 使用np.random.rand(3, 3)可以创建一个3x3的随机数组,每个元素值在0到1之间。
  • 数组运算:
    • NumPy支持向量化操作,可以直接对数组执行逐元素运算,如c = a * b即实现了两个数组的逐元素乘法。
    • 广播机制允许不同形状的数组进行运算,小数组会扩展到大数组的形状。例如,一个1维数组与一个2维数组相加时,1维数组会自动扩展成2维数组的形状后再进行运算。
  • 数学函数:
    • NumPy提供了丰富的数学函数,如np.sin()、np.cos()、np.exp()等,可以直接对数组进行操作。
    • 线性代数运算也非常便捷,例如矩阵乘法可以使用np.dot(A, B)实现。
  • 索引切片:
    • 通过索引和切片操作,可以轻松访问和修改数组中的元素。例如,arr[0]会返回数组的第一个元素,而arr[:, 1]会返回所有行第二列的元素。
    • 高级索引如arr[[0, 1], [2, 3]]允许更复杂的元素选择。
  • 性能计算:
    • NumPy底层用C语言编写,并集成了BLAS和LAPACK等高性能计算库,特别适合处理大规模数据。
    • 释放Python的GIL(全局解释器锁),在进行数组操作时可以实现并行计算,进一步提高性能。
  • 互操作性:
    • NumPy可以与Pandas、SciPy和Matplotlib等多个Python库无缝集成,使得数据处理和分析工作流更加流畅。

三、数组

3.1、数组介绍

Python中的数组是一种用于存储有序数据集合的数据结构,其主要类型包括列表(list)、元组(tuple)和字典(dictionary)。

  • 列表
    • 定义和初始化:列表是可变数组,支持动态增加元素。例如,可以定义一个列表arr = [1, 2, 3]。
    • 索引和切片:通过索引访问特定元素,如arr[0]获取第一个元素。切片操作如arr[1:3]获取从第二个到第三个元素之间的子列表。
    • 修改元素:可以直接修改列表中的元素,如arr[0] = 10将第一个元素改为10。
    • 遍历和迭代:使用for循环或enumerate()函数遍历列表中的元素,如for i, v in enumerate(arr): print(i, v)。
    • 添加和删除元素:append()方法可以在列表末尾添加元素,而insert()方法可以在指定位置插入元素。pop()和remove()方法分别用于删除指定位置和首个匹配的元素。
  • 元组
    • 定义和不可变性:元组一旦创建,其元素不能更改。例如,可以定义一个元组t = (“a”, “b”, “c”)。
    • 索引和切片:与列表类似,但不允许修改元素。例如,t[0]获取第一个元素,t[1:3]获取第二和第三个元素的子元组。
    • 遍历和迭代:可以使用for循环遍历元组中的元素,如for i in t: print(i)。
    • 用做字典键:由于元组是不可变的,它们可以用作字典的键,而列表则不行。
  • 字典
    • 定义和初始化:字典存储键值对,如d = {‘a’: 1, ‘b’: 2, ‘c’: 3}。
    • 访问和修改值:通过键访问和修改对应的值,如d[‘a’]获取键’a’的值,而d[‘a’] = 10将键’a’的值改为10。
    • 遍历和迭代:遍历字典的键、值或键值对,如for k, v in d.items(): print(k, v)。
    • 添加和删除键值对:直接赋值可以添加新的键值对,而del语句或pop()方法用于删除键值对。

3.2、创建数组

ndarray是NumPy提供的用于存储单一数据类型的多维数组;NumPy提供了array函数,可以创建一维或多维数组。

一维数组

一维数组是由数字组成,排序单纯,结构单一的数组,python提供了列表和元组来实现一维数组的存储。

import numpy as np
# 创建一个一维数组
arr = np.array([1, 2, 3, 4, 5])
# 打印数组
print(arr)

D:\pythonLED\python.exe E:/pythonProject/1.py
[1 2 3 4 5]

二维数组

二维数组在python中同样可以用列表和元组来表示。

import numpy as np
# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 打印数组
print(arr)

D:\pythonLED\python.exe E:/pythonProject/1.py
[[1 2 3]
 [4 5 6]
 [7 8 9]]

数组形状变更

数组和python的列表有所不同,他提供了更多的操作,数组的shape属性是可以写的,可以通过修改数组的shape属性,在保持数组元素不变的情况下改变数组每个轴的长度。

import numpy as np
# 创建一个一维数组
arr = np.array([1, 2, 3, 4, 5, 6])
# 将一维数组转换为二维数组,形状为(2, 3)
new_arr = arr.reshape((2, 3))
print("原始数组:")
print(arr)
print("新形状的数组:")
print(new_arr)

D:\pythonLED\python.exe E:/pythonProject/1.py
原始数组:
[1 2 3 4 5 6]
新形状的数组:
[[1 2 3]
 [4 5 6]]

等差序列

NumPy提供了两个函数来创建等差序列,np.arange函数类似python自带的range函数,通过指定开始值,终值和步长来创建一维数组,创建的数组不含终值;np.linspace函数通过指定开始值,终值和元素个数来创建一维

# 使用列表推导式生成等差序列
def generate_arithmetic_sequence(start, end, step):
    return [x for x in range(start, end, step)]
# 使用循环生成等差序列
def generate_arithmetic_sequence_loop(start, end, step):
    sequence = []
    while start < end:
        sequence.append(start)
        start += step
    return sequence
# 测试
print(generate_arithmetic_sequence(1, 10, 2))
print(generate_arithmetic_sequence_loop(1, 10, 2))

D:\pythonLED\python.exe E:/pythonProject/1.py
[1, 3, 5, 7, 9]
[1, 3, 5, 7, 9]

等比序列

NumPy提供np.geomspace函数创建等比序列。

def geometric_sequence(a, r, n):
    return [a * (r ** i) for i in range(n)]
# 生成一个初始值为1,公比为2,长度为5的等比序列
sequence = geometric_sequence(1, 2, 5)
print(sequence)  

D:\pythonLED\python.exe E:/pythonProject/1.py
[1, 2, 4, 8, 16]

单位矩阵

单位矩阵是指主对角线上的元素为1,其他元素为0的二维数组。

import numpy as np
identity_matrix = np.eye(3)
print(identity_matrix)

D:\pythonLED\python.exe E:/pythonProject/1.py
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]

对角线矩阵

对角线矩阵中除主对角线以外其他元素都为0,主对角线的元素可以为0或其他值。

import numpy as np
diagonal_elements = [1, 2, 3]
matrix = np.diag(diagonal_elements)
print(matrix)

D:\pythonLED\python.exe E:/pythonProject/1.py
[[1 0 0]
 [0 2 0]
 [0 0 3]]

随机数组

python自带了一个random模块用来生成随机数,但是random模块的函数每次只能生成一个随机数。

import random
# 创建一个包含5个随机整数的数组,整数范围为1到10
random_array = [random.randint(1, 10) for _ in range(5)]
print(random_array)

D:\pythonLED\python.exe E:/pythonProject/1.py
[2, 7, 6, 8, 1]

3.3、数组的大小

NumPy除了使用shape属性来表示数组的形状外,还提供了几种属性来表示数组的大小。

属性说明
ndim表示数组的维数
shape表示数组的形状,对于n行m列的矩阵,shape(n,m)
size表示数组的元素个数
itemsize表示数组中单个元素的大小
import numpy as np
# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 使用 ndim 属性获取数组的维度
dimensions = arr.ndim
print("数组的维度为:", dimensions)

D:\pythonLED\python.exe E:/pythonProject/1.py
数组的维度为: 2
import numpy as np
# 创建一个一维数组
arr1 = np.array([1, 2, 3, 4, 5])
print("一维数组的大小:", arr1.size)  # 输出:5
# 创建一个二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print("二维数组的大小:", arr2.size)  # 输出:6

D:\pythonLED\python.exe E:/pythonProject/1.py
一维数组的大小: 5
二维数组的大小: 6
import numpy as np
# 创建一个一维数组
arr = np.array([1, 2, 3, 4, 5])
# 获取数组中每个元素的字节大小
item_size = arr.itemsize
print("每个元素的字节大小:", item_size)

D:\pythonLED\python.exe E:/pythonProject/1.py
每个元素的字节大小: 8

3.4、通过索引访问数组

一维数组

import numpy as np
# 创建一个一维数组
arr = np.array([1, 2, 3, 4, 5])
# 通过整数索引访问数组中的元素
print(arr[0])  # 输出:1
print(arr[2])  # 输出:3
# 通过切片访问数组的一部分
print(arr[1:4])  # 输出:[2 3 4]
print(arr[:3])   # 输出:[1 2 3]
print(arr[2:])   # 输出:[3 4 5]

D:\pythonLED\python.exe E:/pythonProject/1.py
1
3
[2 3 4]
[1 2 3]
[3 4 5]

多维数组

import numpy as np
# 创建一个二维数组
arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("二维数组:")
print(arr_2d)
# 通过索引访问二维数组的元素
print("访问第1行第2列的元素:", arr_2d[0, 1])
# 创建一个三维数组
arr_3d = np.array([[[1, 2, 3], [4, 5, 6], [7, 8, 9]], [[10, 11, 12], [13, 14, 15], [16, 17, 18]]])
print("三维数组:")
print(arr_3d)
# 通过索引访问三维数组的元素
print("访问第1个矩阵的第2行第3列的元素:", arr_3d[0, 1, 2])

D:\pythonLED\python.exe E:/pythonProject/1.py
二维数组:
[[1 2 3]
 [4 5 6]
 [7 8 9]]
访问第1行第2列的元素: 2
三维数组:
[[[ 1  2  3]
  [ 4  5  6]
  [ 7  8  9]]

 [[10 11 12]
  [13 14 15]
  [16 17 18]]]
访问第1个矩阵的第2行第3列的元素: 6

Process finished with exit code 0

3.5、变换数组的形态

NumPy除了提供直接修改shape属性的方法来改变数组的形状外,还提供了reshape函数来改变数组的形状;reshape函数不会改变原始数组的形状,新生成的数组与原始数组共享一块数据存储空间。

import numpy as np
# 创建一个一维数组
arr = np.array([1, 2, 3, 4, 5, 6])
# 使用reshape()函数将一维数组转换为二维数组
reshaped_arr = arr.reshape((2, 3))
print("原始数组:")
print(arr)
print("变换后的数组:")
print(reshaped_arr)

D:\pythonLED\python.exe E:/pythonProject/1.py
原始数组:
[1 2 3 4 5 6]
变换后的数组:
[[1 2 3]
 [4 5 6]]

3.6、常用的ufunc运算

ufunc运算是NumPy库中的一个概念,它表示通用函数(universal function)。ufunc是一种能够对数组中的每个元素进行操作的函数,它允许你在整个数组上执行元素级别的操作,而无需使用循环。ufunc具有广播功能,可以自动处理不同形状的数组之间的操作。这使得ufunc在处理大量数据时非常高效。

矩阵的四则运算

import numpy as np
arr = np.array([1, 2, 3, 4, 5])
add_result = np.add(arr, 2)
print(add_result)  # 输出:[3 4 5 6 7]
subtract_result = np.subtract(arr, 2)
print(subtract_result)  # 输出:[-1  0  1  2  3]
multiply_result = np.multiply(arr, 2)
print(multiply_result)  # 输出:[ 2  4  6  8 10]
divide_result = np.divide(arr, 2)
print(divide_result)  # 输出:[0.5 1.  1.5 2.  2.5]

D:\pythonLED\python.exe E:/pythonProject/1.py
[3 4 5 6 7]
[-1  0  1  2  3]
[ 2  4  6  8 10]
[0.5 1.  1.5 2.  2.5]

矩阵的比较运算

import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[4, 3], [2, 1]])
result = np.greater(A, B)
print(result)

D:\pythonLED\python.exe E:/pythonProject/1.py
[[False False]
 [ True  True]]

逻辑运算

import numpy as np

A = np.array([[1, 0, 1],
              [0, 1, 0],
              [1, 1, 0]])

B = np.array([[1, 1, 0],
              [0, 1, 1],
              [1, 0, 0]])
C = np.logical_and(A, B)
print(C)

D:\pythonLED\python.exe E:/pythonProject/1.py
[[ True False False]
 [False  True False]
 [ True False False]]

NumPy提供了三角函数、随机和概率分布、基本数值统计、傅里叶变换、矩阵运算等丰富的函数运算。

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十一的学习笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值