首页 > 编程语言 >Python进阶教程--科学计算基础软件包NumPy

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

时间:2024-07-01 21:27:27浏览次数:3  
标签:进阶 Python numpy 矩阵 -- 数组 np array 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的随机抽样子模块提供了丰富的函数来生成不同分布的随机数,这些函数在统计模拟、机器学习算法和数据生成中非常有用。

标签:进阶,Python,numpy,矩阵,--,数组,np,array,NumPy
From: https://blog.csdn.net/weixin_32759777/article/details/140110265

相关文章

  • 关于AndroidStudio中的onCreate方法
    onCreate方法是Android应用程序中的一个生命周期方法,它是每个Activity(活动)都必须实现的方法之一。具体来说,它是在Activity第一次创建时调用的方法,用于完成一些初始化设置和布局加载工作。主要作用设置布局:通过调用setContentView方法来加载指定的布局文件,将界面内......
  • HarmonyOS 开发探索: ArkUI常用样式布局
     ArkUI布局简介ArkUI支持多种布局方式,包括但不限于Column、Row、Stack、Flex等。这些布局方式能够满足不同的UI设计需求,帮助开发者高效地创建复杂的界面。1.Column布局Column布局用于垂直排列子组件,适用于需要纵向排列元素的场景。它在创建列表、表单等界面时非常实用。@......
  • popen函数
    目的开发过程中获取某个可执行文件的打印结果或者获取某个shell命令的打印结果原理FILE*popen(constchar*command,constchar*type);intpclose(FILE*stream);popen()函数通过创建一个管道,调用fork产生一个子进程,执行一个shell以运行命令来开启一个进......
  • Luogu P9542 [湖北省选模拟 2023] 棋圣 alphago
    2023.08.19:修改了一处笔误。手玩发现对于一颗生成树,如果存在至少一个点的度数\(>2\)(即不为链),那么肯定能使得所有棋子都在一条边的两个端点上。因为有度数\(>2\)的点的存在,这里就可以合并与其相连的点的棋子。先考虑非链的情况的答案,记两部分棋子黑白棋子颜色分别为\(c(a/......
  • 2024/7/1工作日志
    (一)今日总结今天主要是安排上了住宿,同梁总和公司一众工作骨干进行了协调工作会议,把整个排产的一套实际业务流程走了一遍,为后续项目推进提供实际构思。主要由负责排产这块的冯丽冯经理与杜经理进行持续沟通,还有负责运营的赵总。1.上午主要同冯经理进行了二次的深入协调沟通,主要针......
  • educoder 机器学习 --- kNN算法
    第一关:#encoding=utf8importnumpyasnpfromcollectionsimportCounterclasskNNClassifier(object):def__init__(self,k):'''初始化函数:paramk:kNN算法中的k'''self.k=k#用来......
  • Luogu P6864 [RC-03] 记忆
    先考虑没有\(3\)操作该怎么做。对于当前字符串把其分成多组互不包含的括号的形式,即\((\cdots)()()\)这样,考虑经过\(1/2\)操作后对互不包含的括号组数\(b\)和答案\(v\)会产生什么影响。\(1\)操作,加上过后便会多上一组互不包含的括号,\(b\leftarrowb'+1\),同时这个......
  • 博欧实习(一)
    晨会听到的公司发展方向:1、现阶段公司开发方向:Mes系统+PLM工艺软件,利用机器采集数据,制作更完整的日接单系统。2、系统获取数据方式:公司建立数据池,以后的数据通过Execl在每个系统之间传递.参观工厂收获3、现阶段生产部人力排产方式:通过对每个产品复杂度评估,给出计划完成日期......
  • 详细讲解 Keil Pack Installer,以及通过 Keil 官网获取 Pack
    前言大家好,我是梁国庆。收到粉丝留言,说Keil安装Pack不太明白,可不可以详细演示一下?当然可以有,直接视频+文章全部安排,我就是宠粉。PS:第一次录视频有些紧张,见谅哈。微信视频号:https://weixin.qq.com/sph/AXbpYwEawb站:https://www.bilibili.com/video/BV1zx4y147ZJ/Keil......
  • 牛客周赛 Round 44
    A题每三张删除一张,n/3就是答案点击查看代码#include<bits/stdc++.h>#defineall(x)(x).begin(),(x).end()#definefifirst#definesesecondusingi64=longlong;usingpii=std::pair<int,int>;template<typenameT>std::vector<T>read(T&n......