Python进阶教程--科学计算基础软件包NumPy

NumPy(Numerical Python)是一个开源的Python库,用于科学计算。它提供了一个高性能的多维数组对象和用于处理这些数组的工具。NumPy是Python科学计算的基础库,被广泛用于数据分析、机器学习、科学计算等领域。

1.1 NumPy 概述

NumPy是Python的一个扩展库,主要用于处理大型多维数组和矩阵,提供了丰富的数学函数库。NumPy的核心是ndarray(N-dimensional array)对象,它可以存储不同类型的数据,并且提供了许多操作符和函数,使得对数组的操作变得非常方便。NumPy的数组运算比Python内置的列表运算要快得多,因为NumPy的数组运算是在底层使用C语言实现的。
NumPy提供了以下主要功能:

  1. 高性能的多维数组对象(ndarray),用于存储和处理大型数据集。
  2. 用于对数组进行快速运算的数学函数库。
  3. 用于读写硬盘上数据的工具。
  4. 线性代数、傅里叶变换、随机数生成等常用科学计算功能。
    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的随机抽样子模块提供了丰富的函数来生成不同分布的随机数,这些函数在统计模拟、机器学习算法和数据生成中非常有用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/38872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++把一个类封装成动态链接库

一、步骤 1. 创建类头文件 首先,定义你要封装的类。例如,创建一个名为MyClass的类: // MyClass.h #pragma once#ifdef MYCLASS_EXPORTS #define MYCLASS_API __declspec(dllexport) #else #define MYCLASS_API __declspec(dllimport) #end…

智能扫地机器人程序中出现的问题可以参考的解决方案

在解决智能扫地机器人程序中可能遇到的问题时,可以参考以下分点表示和归纳的解决方案: 环境感知与地图构建 ① 使用先进的传感器技术:如激光雷达、超声波和红外传感器,以提高环境感知的准确性和可靠性。 ② 优化地图构建算法&a…

AI辅助设计:如何通过机器学习革新创意工作流程

🍁 作者:知识浅谈,CSDN签约讲师,CSDN博客专家,华为云云享专家,阿里云专家博主 📌 擅长领域:全栈工程师、爬虫、ACM算法,大数据,深度学习 💒 公众号…

WCCI 2024开幕,横滨圣地巡礼,畅游动漫与美食的世界

惊喜!WCCI 2024开幕,横滨圣地巡礼!畅游动漫与美食的世界 会议之眼 快讯 会议介绍 IEEE WCCI(World Congress on Computational Intelligence)2024,即2024年IEEE世界计算智能大会,于6月30日至…

windows USB 设备驱动开发-Host端和Device端

Windows 中的 USB 宿主端驱动程序 下图显示了适用于 Windows 的 USB 驱动程序堆栈的体系结构框图。 此图显示了适用于 USB 2.0 和 USB 3.0 的单独 USB 驱动程序堆栈。 当设备连接到 xHCI 控制器时,Windows 加载 USB 3.0 驱动程序堆栈。 Windows 为连接到 EHCI、OHC…

星辰计划01-动态代理

会话1: 什么是动态代理? 👧 什么是代理啊?👨来来来,听我细细来说 代理这个词在不同的上下文中有不同的含义,主要可以归纳为以下几类解释: 计算机网络中的代理服务器(Proxy Server&#xff0…

跨平台Ribbon UI组件QtitanRibbon全新发布v6.7.0——支持Qt 6.6.3

没有Microsoft在其办公解决方案中提供的界面,就无法想象现代应用程序,这个概念称为Ribbon UI,目前它是使应用程序与时俱进的主要属性。QtitanRibbon是一款遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,QtitanRibb…

Linux_生产消费模型_Block_Queue

目录 一、互斥锁 1.1 错误的抢票 1.1.1 类的成员函数与构造 1.1.2 start 函数 1.1.3 线程的回调函数 1.1.4 main 函数 1.1.5 结果 1.2 概念 1.3 相关系统调用 1.3.1 锁的创建 1.3.2 锁的初始化 1.3.2.1 动态初始化 1.3.2.2 静态初始化 1.3.3 锁的销毁 1.3.4…

看不懂懂车大爆炸,你就错过了国产小车的王炸!

咦?咋的啦?咱中国自己的汽车品牌前几天在汽车工业协会公布的数据里一跃而起,真的是威风凛凛啊!2023年咱们自家的乘用车品牌市场份额硬生生地占了个56%,这可是半壁江山啊!特别是那些10万块钱以下的家用小车&…

32.哀家要长脑子了!

1.299. 猜数字游戏 - 力扣(LeetCode) 公牛还是挺好数的,奶牛。。。妈呀,一朝打回解放前 抓本质抓本质,有多少位非公牛数可以通过重新排列转换公牛数字,意思就是,当这个数不是公牛数字时&#x…

19-Pandas merge合并操作

Pandas merge合并操作(主键合并数据) Pandas 提供的 merge() 函数能够进行高效的合并操作,这与 SQL 关系型数据库的 join用法非常相似。从字面意思上不难理解,merge 翻译为“合并”,指的是将两个 DataFrame 数据表按照指定的规则进行连接&am…

C++多态~~的两个特殊情况

目录 1.多态的概念 2.简单认识 (1)一个案例 (2)多态的两个满足条件 (3)虚函数的重写 (4)两个特殊情况 1.多态的概念 (1)多态就是多种形态; …

SQL 29 计算用户的平均次日留存率题解

问题截图如下: SQL建表代码: drop table if exists user_profile; drop table if exists question_practice_detail; drop table if exists question_detail; CREATE TABLE user_profile ( id int NOT NULL, device_id int NOT NULL, gender varchar…

小白也能懂:逆向分析某网站加速乐Cookie参数流程详解

加速乐作为一种常见的反爬虫技术,在网络上已有大量详尽深入的教程可供参考。然而,对于那些初次接触的人来说,直接面对它可能仍会感到困惑。 声明 本文仅用于学习交流,学习探讨逆向知识,欢迎私信共享学习心得。如有侵权…

【区块链+基础设施】珠三角征信链 | FISCO BCOS应用案例

“珠三角征信链”是中国人民银行广州分行、中国人民银行深圳市中心支行按照中国人民银行总行工作部署,积 极贯彻珠三角一体化发展、粤港澳大湾区建设等国家战略而建设的跨区域征信一体化数据中心枢纽,以 FISCO BCOS 为底链构建应用平台,并由微…

springboot接口防抖【防重复提交】

什么是防抖 所谓防抖,一是防用户手抖,二是防网络抖动。在Web系统中,表单提交是一个非常常见的功能,如果不加控制,容易因为用户的误操作或网络延迟导致同一请求被发送多次,进而生成重复的数据记录。要针对用…

猫头虎分享如何使用AIGC一键生成爆款公众号文案?

猫头虎分享如何使用AIGC一键生成爆款公众号文案? 前言 在自媒体时代,如何撰写一篇能引发广泛分享、获得微信平台推荐的爆款文章,是每一位公众号作者追求的目标。今天,猫头虎将为大家揭秘如何利用AIGC(人工智能生成内…

Docker 镜像导出和导入

docker 镜像导出 # 导出 docker 镜像到本地文件 docker save -o [输出文件名.tar] [镜像名称[:标签]] # 示例 docker save -o minio.tar minio/minio:latest-o 或 --output:指定导出文件的路径和名称[镜像名称[:标签]]:导出镜像名称以及可选的标签 dock…

【Python画图-驯化01】一文叫你搭建python画图最优环境配置

【Python画图-循环01】一文叫你搭建python画图最优环境配置 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! 🎇 免费获取相关内容文档关注&#…

Windows/Linux/Mac 系统局域网服务发现协议及传输速度比较

简介 分析 / 验证对比常见局域网服务发现协议在 Windows/Linux/Mac 等不同系统下的支持和表现 在使用不同系统的智能硬件时,如常见的树莓派 / Openwrt 路由器 / Debian/Fedora/Windows/Mac 等系统是,系统间相互发现以及网络共享本应是系统的基础服务&a…