数据分析讲课笔记02:科学计算库Numpy

news2024/9/23 3:22:55

文章目录

  • 零、学习目标
  • 一、认识NumPy数组对象
    • (一)N维数组对象ndarray
    • (二)ndarray对象重要的属性
    • (三)ndarray数组案例演示
  • 二、创建NumPy数组
    • (一)采用array()函数创建数组
    • (二)采用zeros()和ones()函数创建数组
    • (三)采用empty()函数创建数组
    • (四)采用arange()函数创建数组
    • (五)注意事项
  • 三、ndarray对象的数据类型
    • (一)查看数据类型
      • 1、查看数据类型名
      • 2、数据类型的构成
      • 3、常用的数据类型
      • 4、数据类型的特征码
    • (二)转换数据类型
  • 四、数组运算
    • (一)矢量化运算
    • (二)广播机制
      • 1、广播机制出现的场景
      • 2、广播机制满足的条件
    • (三)数组与标量运算
  • 五、ndarray的索引和切片
    • (一)整数索引和切片的基本使用
      • 1、针对一维数组
      • 2、针对二维数组
    • (二)花式(数组)索引的基本使用
    • (三)布尔型索引的基本使用
  • 六、数组的转置和轴对称
    • (一)使用T属性实现数组的转置
    • (二)使用transpose()方法实现数组的转置
    • (三)使用swapaxes()方法实现数组的转置
    • (四)多学一招 - 维度编号问题
  • 七、NumPy通用函数
    • (一)通用函数概念
    • (二)常见一元通用函数
    • (三)常见二元通用函数
  • 八、利用NumPy数组进行数据处理
    • (一)将条件逻辑转为数组运算
    • (二)数组统计运算
    • (三)数组排序
    • (四)检索数组元素
    • (五)唯一化及其他集合逻辑
  • 九、线性代数模块
    • (一)线性代数模块
    • (二)案例 - 求解线性方程组
      • 1、利用行列式计算
      • 2、利用矩阵计算
  • 十、随机数模块
    • (一)rand()函数
    • (二)其它函数
  • 十一、本节小结

零、学习目标

  1. 掌握创建数组,数组运算,索引与切片
  2. 掌握利用数组进行数据处理
  3. 掌握转置和轴对称,通用函数
  4. 熟悉数据类型,线性代数模块,随机数模块

NumPy是Python中用于数值计算的核心库,其中ndarray(n维数组)为其主要数据结构,提供高效存储和处理多维数据的能力。通过array()函数、zeros()ones()等方法创建数组,并可指定数据类型如int32或float64。数组支持矢量化运算、广播机制以及与标量运算,简化了大量数学计算操作。利用索引和切片技术可以访问和修改数组元素,包括整数索引、切片索引、花式索引和布尔型索引。此外,NumPy提供了转置、轴对称变换以及通用函数如sum()mean()等进行统计计算,还有排序、唯一化及集合逻辑操作。其linalg模块涵盖了线性代数相关功能,如矩阵乘法、求逆、解方程组等。随机数生成方面,random模块可产生各种概率分布的随机数,助力模拟实验和数据分析。

一、认识NumPy数组对象

(一)N维数组对象ndarray

  • NumPy库的核心功能体现在其N维数组对象ndarray上,该对象在Python中被广泛用于高效科学计算和数据分析。ndarray是一个多维数据结构,能够容纳同类型元素的集合,并且支持向量化运算、广播机制以及丰富的数学函数操作。通过定义如维度(ndim)、形状(shape)、大小(size)和数据类型(dtype)等关键属性,ndarray能够精确描述和控制大规模数值数据集。用户可通过多种方式创建数组,包括从列表、元组或特定值填充,并能灵活指定数据类型以满足不同精度需求。这些特性使得ndarray成为现代科学计算、机器学习和数据分析等领域不可或缺的基础工具。
    在这里插入图片描述

(二)ndarray对象重要的属性

属性具体说明
ndarray维度个数,也就是数组轴的个数,比知如一维、二维、三维等
ndarray.shape数组的维度。这是一个整数的元组,表示每个维度上数组的大小。例如,一个n行和m列的数组,它的shape属性为(n, m)
ndarray.size数组元素的总个数,等于shape属性中元组元素的乘积
ndarray.dtype描述数组中元素类型的对象,既可以使用标准的Python类型创建或指定,也可以使用NumPy特有的数据类型来指定,比如numpy.int32、numpy.float64等
ndarray.itemsize数组中每个元素的字节大小。例如,元素类型为float64的数组有8 ( 64/8)个字节,这相当于ndarray.dtype.itemsize

(三)ndarray数组案例演示

  • 创建数组(3行4列的二维数组)
    在这里插入图片描述
  • 查看变量数据类型
    在这里插入图片描述
  • 查看数组对象属性
    在这里插入图片描述

二、创建NumPy数组

  • NumPy库中创建ndarray对象有多种方式。首先,使用array()函数将列表或元组转换为数组。其次,zeros()ones()分别生成元素全为0或1的数组,而empty()则创建一个未初始化(随机填充)的数组。另外,通过arange()可以创建等差数列组成的数组,类似Python内置的range()但返回结果是数组类型。最后,注意数组中的元素显示形式,如11.的区别源于元素的数据类型差异。

(一)采用array()函数创建数组

  • 最简单的创建ndarray对象的方式是使用array()函数,在调用该函数时传入一个列表或者元组。
    在这里插入图片描述

(二)采用zeros()和ones()函数创建数组

  • 通过zeros()函数创建元素值都是0的数组;通过ones()函数创建元素值都为1的数组。
    在这里插入图片描述

(三)采用empty()函数创建数组

  • 通过empty()函数创建一个新的数组,该数组只分配了内存空间,它里面填充的元素都是随机的。
    在这里插入图片描述

(四)采用arange()函数创建数组

  • 通过arange()函数可以创建一个等差数组,它的功能类似于range(),只不过arange()函数返回的结果是数组,而不是列表。
    在这里插入图片描述

(五)注意事项

  • 大家可能注意到,有些数组元素的后面会跟着一个小数点,而有些元素后面没有,比如11.,产生这种现象,主要是因为元素的数据类型不同所导致的。

三、ndarray对象的数据类型

  • NumPy的ndarray对象具有特定的数据类型,通过ndarray.dtype.name可查看具体类型名称。数组创建时,默认如zeros、ones等函数生成float64类型数据,在不同系统上整数默认长度可能不同(int32或int64)。支持多种数据类型包括布尔、整型、浮点型、复数以及对象和字符串等,并可通过dtype参数指定。转换数据类型使用astype()方法,例如将整型数组转为浮点型。特征码提供了一种简写形式标识数据类型。

(一)查看数据类型

1、查看数据类型名

  • ndarray.dtype可以创建一个表示数据类型的对象,如果希望获取数据类型的名称,则需要访问name属性进行获取。
    在这里插入图片描述

2、数据类型的构成

  • NumPy的数据类型是由一个类型名元素位长的数字组成。

通过zeros()、ones()、empty()函数创建的数组,默认的数据类型为float64。
默认情况下,64位windows系统输出的结果为int32,64位Linux或macOS系统输出结果为int64,当然也可以通过dtype来指定数据类型的长度。

3、常用的数据类型

数据类型含义
bool_布尔类型,值为True或False
int8, uint8有符号和无符号的8位整数
int16, uint16有符号和无符号的16位整数
int32, uint32有符号和无符号的32位整数
int64, uint64有符号和无符号的64位整数
float16半精度浮点数(16位)
float32半精度浮点数(32位)
float64半精度浮点数(64位)
complex64复数,分别用两个32位浮点数表示实部和虚部
complex128复数,分别用两个64位浮点数表示实部和虚部
objectPython对象
stirng_固定长度的字符串类型
uncode_, str_固定长度的unicode类型
  • 创建数组时不指定数据类型
    在这里插入图片描述

  • 创建数组时指定数据类型
    在这里插入图片描述

4、数据类型的特征码

特征码含义
b布尔型
u无符号整型
c复数类型
S, a字节字符串
V原始数据
i有符号整型
f浮点型
OPython对象
Uunicode字符串

(二)转换数据类型

  • ndarray对象的数据类型可以通过astype()方法进行转换。

  • 创建二维整型数组
    在这里插入图片描述

  • 将整型转换成浮点型
    在这里插入图片描述

四、数组运算

  • NumPy数组支持三种类型的运算:矢量化运算、广播机制和数组与标量运算。矢量化运算允许相同形状的数组进行元素级别的算术运算,生成新数组。广播机制在不同形状数组间运算时启用,自动扩展数组以匹配维度并逐元素计算。满足条件(相同维度长度或一维数组参与)时可进行广播。标量与数组运算会将标量值应用到数组所有元素上,产生同样形状的新数组。
    在这里插入图片描述

(一)矢量化运算

  • 形状相等的数组之间的任何算术运算都会应用到元素级,即只用于位置相同的元素之间,所得的运算结果组成一个新的数组。
    在这里插入图片描述

  • 一维数组加法运算(逐个元素相加)
    在这里插入图片描述

  • 二维数组乘法运算(逐个元素相乘)
    在这里插入图片描述

(二)广播机制

1、广播机制出现的场景

  • 当形状不相等的数组执行算术计算的时候,就会出现广播机制,该机制会对数组进行扩展,使数组的shape属性值一样,这样就可以进行矢量化运算了。
    在这里插入图片描述
  • 案例演示
    在这里插入图片描述

2、广播机制满足的条件

  • 广播机制进行数组运算时,要求满足以下条件之一:要么两个数组在某一维度上有相同长度,要么其中一个是单维度数组。为实现逐元素运算,广播会将较小维度的数组扩展到与较大数组相同的形状,确保二者可以进行兼容的元素级计算。

(三)数组与标量运算

  • 标量运算会产生一个与数组具有相同行和列的新矩阵,其原始矩阵的每个元素都被相加、相减、相乘或者相除。
    在这里插入图片描述
  • 案例演示
    在这里插入图片描述

五、ndarray的索引和切片

  • NumPy库中的ndarray支持整数索引和切片操作,与Python列表相似但功能更丰富。在一维数组中,通过单个或多个整数直接索引元素;在二维数组中,采用元组形式(行号, 列号)访问特定元素,而切片可按需选取部分行或列。此外,ndarray特有的花式索引允许使用整数数组或列表选择多处数据,并能混合使用整数索引和切片。布尔型索引则根据布尔数组选取对应为True的元素。这些灵活的索引方式极大地增强了对多维数组数据的操作能力。

(一)整数索引和切片的基本使用

1、针对一维数组

  • 对于一维数组来说,从表面上来看,它使用索引和切片的方式,与Python列表的功能相差不大。
    在这里插入图片描述

2、针对二维数组

  • 对于多维数组来说,索引和切片的使用方式与列表就大不一样了

  • 二维数组的索引方式如下所示
    在这里插入图片描述

  • 在二维数组中,每个索引位置上的元素不再是一个标量了,而是一个一维数组。

  • 获取二维数组第1行数据
    在这里插入图片描述

  • 获取二维数组第2列数据
    在这里插入图片描述

  • 如果想获取二维数组的单个元素,则需要通过形如“arr[x,y]”的索引来实现,其中x表示行号,y表示列号。
    在这里插入图片描述

  • 多维数组的切片是沿着行或列的方向选取元素的,我们可以传入一个切片,也可以传入多个切片,还可以将切片与整数索引混合使用。
    在这里插入图片描述

(二)花式(数组)索引的基本使用

  • 花式索引是NumPy的一个术语,是指用整数数组或列表进行索引,然后再将数组或列表中的每个元素作为下标进行取值。

  • 当使用一个数组或列表作为索引时,如果使用索引要操作的对象是一维数组,则获取的结果是对应下标的元素。

  • 如果要操作的对象是一个二维数组,则获取的结果就是对应下标的一行数据。

  • 获取索引为[0, 2]的元素
    在这里插入图片描述

  • 案例演示
    在这里插入图片描述

  • 如果用两个花式索引操作数组,则会将第1个作为行索引,第2个作为列索引,以二维数组索引的方式选取其对应位置的元素。

  • 获取索引为(1, 1)和(3, 2)的元素
    在这里插入图片描述
    在这里插入图片描述

(三)布尔型索引的基本使用

  • 布尔型索引指的是将一个布尔数组作为数组索引,返回的数据是布尔数组中True对应位置的值。
    在这里插入图片描述
    在这里插入图片描述

六、数组的转置和轴对称

  • NumPy中数组的转置操作可通过T属性或transpose()方法实现,其中T属性适用于简单转置(例如二维数组行列互换),而transpose()允许指定轴编号进行更复杂的维度变换,默认情况下执行常规转置。此外,针对特定两个轴交换需求,可使用swapaxes()方法。在处理高维数据时需注意,轴编号从0开始计数,依次对应各个维度,这在进行转置等操作时至关重要。

(一)使用T属性实现数组的转置

  • 简单的转置可以使用T属性,它其实就是进行轴对换而已。
    在这里插入图片描述
    在这里插入图片描述

(二)使用transpose()方法实现数组的转置

  • 当使用transpose()方法对数组的shape进行调换时,需要以元组的形式传入shape的编号,比如(1, 0, 2)。
    在这里插入图片描述

  • 如果我们不输入任何参数,直接调用transpose()方法,则其执行的效果就是将数组进行转置,作用等价于transpose(2, 1, 0)
    在这里插入图片描述

(三)使用swapaxes()方法实现数组的转置

  • 有时可能只需要转换其中的两个轴,这时可以使用swapaxes()方法实现,该方法需要接受一对轴编号,比如(1,0)。
    在这里插入图片描述

(四)多学一招 - 维度编号问题

  • 高维数据执行某些操作(如转置)时,需要指定维度编号,这个编号是从0开始的,然后依次递增1。其中,位于纵向的轴(y轴)的编号为0,位于横向的轴(x轴)的编号为1,以此类推。
    在这里插入图片描述

七、NumPy通用函数

(一)通用函数概念

  • NumPy中的通用函数(ufuncs)是高效执行数组元素级运算的关键工具,包括一元和二元函数。一元ufunc如abs计算绝对值,sqrt求平方根等;二元ufunc如add进行元素级加法,subtract进行减法等。这些函数可处理整数、浮点数、复数及逻辑比较,并支持三角函数、指数对数运算以及判断无穷、NaN等特殊数值。通过运用ufunc,用户能轻松实现快速且向量化的基本数学运算。

(二)常见一元通用函数

函数描述
abs, fabs计算整数、浮点数或复数的绝对值
sqrt计算各元素的平方根
exp计算各元素的指数 e x e^x ex
log, log10, log2, log1p分别为自然对数(底数为e),底数为10的log,底数为2的log,自然底数的log(1+x)
sign计算各元素的正负号:1(正数)、0(零)、-1(负数)
ceil计算各元素的ceiling值,即大于或者等于该值的最小整数
floor计算各元素的floor值,即小于或者等于该值的最大整数
rint将各元素四舍五入到最接近的整数
modf将数组的小数和整数部分以两个独立数组的形式返回
isnan返回一个表示“哪些值是NaN”的布尔型数组
isfinite, isinf分别返回表示“哪些元素是有穷的”或“哪些元素是无穷”的布尔型数组
sin、sinh、cos、cosh、tan、tanh普通型和双曲型三角函数
arcsin、arcsinh、arccos、arccosh、arctan、arctanh普通型和双曲型反三角函数
  • 案例演示
    在这里插入图片描述

(三)常见二元通用函数

函数描述
add将数组中对应的元素相加
subtract将数组中对应的元素相减
multiply将数组中对应的元素相乘
divide, floor_divide除法或向下整除法(舍去余数)
maximum, fmax元素级的最大值计算
minimum, fmin元素级的最小值计算
mod元素级的求模运算
copysign将第二个数组的值的符号赋值给第一个数组中的值
greater、greater_equal、less、less_equal、equal、not_equal、logical_and、logical_or、logical_not执行元素级的比较运算,最终产生布尔型数组,相当于运算符>、≥、<、≤、==、!=
  • 案例演示
    在这里插入图片描述

八、利用NumPy数组进行数据处理

  • NumPy库为数组数据处理提供了丰富的方法。其中where()函数实现条件逻辑的向量化,进行元素级选择赋值。统计运算如求和、平均、最大最小值以及它们对应的索引等操作简单易行。数组排序可使用sort()方法,并指定轴参数对特定维度排序。通过all()any()函数可快速判断数组内所有或任一元素是否满足条件。此外,NumPy还支持集合逻辑操作,如唯一化(unique())、交集(intersect1d())、并集(union1d())和差集(setdiff1d())等,便于高效处理集合关系。利用这些功能,用户能便捷地完成各类复杂的数据分析任务。

(一)将条件逻辑转为数组运算

  • NumPy的where()函数是三元表达式x if condition else y的矢量化版本。
    在这里插入图片描述

(二)数组统计运算

  • 通过NumPy库中的相关方法,我们可以很方便地运用Python进行数组的统计汇总。
方法描述
sum对数组中全部或某个轴向的元素求和
mean算术平均值
min计算数组中的最小值
max计算数组中的最大值
argmin表示最小值的索引
argmax表示最大值的索引
cumsum所有元素的累计和
cumprod所有元素的累计积
  • 案例演示
    在这里插入图片描述

(三)数组排序

  • 如果希望对NumPy数组中的元素进行排序,可以通过sort()方法实现。
    在这里插入图片描述

  • 如果希望对任何一个轴上的元素进行排序,则需要将轴的编号作为sort()方法的参数传入。
    在这里插入图片描述

(四)检索数组元素

  • all()函数用于判断整个数组中的元素的值是否全部满足条件,如果满足条件返回True,否则返回False
    在这里插入图片描述

  • any()函数用于判断整个数组中的元素至少有一个满足条件就返回True,否则就返回False
    在这里插入图片描述

(五)唯一化及其他集合逻辑

  • 针对一维数组,NumPy提供了unique()函数来找出数组中的唯一值,并返回排序后的结果。
    在这里插入图片描述

  • in1d()函数用于判断数组中的元素是否在另一个数组中存在,该函数返回的是一个布尔型的数组。
    在这里插入图片描述

  • NumPy提供的有关集合的函数还有很多,常见的函数如下表所示。

函数描述
unique(x)计算x中的唯一元素,并返回有序结果
intersect1d(x, y)计算x和y的交集,并返回有序结果
union1d(x, y)计算x和y的并集,并返回有序结果
in1d(x, y)得到一个表示“x的元素是否包含y”的布尔型数组
setdiff1d(x, y)集合的差,即元素在x中且不在y中
setxor1d(x, y)集合的对称差,即存在于一个数组中但不同时存在于两个数组中的元素
  • 演示交、并、差、对称差运算
    在这里插入图片描述

  • 利用维恩图表示集合运算
    在这里插入图片描述

九、线性代数模块

(一)线性代数模块

  • NumPy的numpy.linalg模块提供了丰富的线性代数运算,如矩阵乘法(dot函数)、计算行列式(det函数)、求逆矩阵(inv函数)、解线性方程组(solve函数)和进行矩阵分解等。利用这些函数,用户可以方便地解决复杂的数学问题。例如,在求解线性方程组时,既可以应用克莱姆法则通过计算行列式来求解变量,也可直接使用linalg.solve()方法实现高效精确计算。此外,该模块还支持对角线操作、迹计算以及特征值和奇异值分解等功能,满足不同场景下的矩阵分析需求。

  • 例如,矩阵相乘,如果我们通过“*”对两个数组相乘的话,得到的是一个元素级的积,而不是一个矩阵点积。

  • NumPy中提供了一个用于矩阵乘法的dot()方法。
    在这里插入图片描述

  • 矩阵点积的条件是矩阵A的列数等于矩阵B的行数,假设A为 m*p的矩阵,B为 p*n 的矩阵,那么矩阵A与B的乘积就是一个 m*n 的矩阵C,其中矩阵C的第i行第j列的元素可以表示为:

  • C = A ⋅ B = ∑ k = 1 p a i k b k j = a i 1 b 1 j + a i 2 b 2 j + … … + a i p b p j C=A \cdot B=\displaystyle \sum_{k=1}^p a_{ik}b_{kj}=a_{i1}b_{1j}+a_{i2}b_{2j}+……+a_{ip}b_{pj} C=AB=k=1paikbkj=ai1b1j+ai2b2j+……+aipbpj

  • 除此之外,linalg模块中还提供了其他很多有用的函数。

函数描述
dot矩阵乘法
diag以一维数组的形式返回方阵的对角线,或将一维数组转为方阵
trace计算对角线元素和
det计算方阵的行列式
eig计算方阵的特征值和特征向量
inv计算方阵的逆
qr计算qr分解
svd计算奇异值
solve解线性方程组AX=b,其中A是一个方阵
lstsq计算AX=b的最小二乘解

(二)案例 - 求解线性方程组

  • { x + 2 y + 3 z = 14 ( 1 ) 2 x − 4 y + z = − 3 ( 2 ) 3 x + 5 y − 2 z = 7 ( 3 ) \begin{cases} x + 2y + 3z = 14 &(1)\\ 2x -4y +z = -3 &(2)\\ 3x + 5y - 2z = 7 &(3) \end{cases} x+2y+3z=142x4y+z=33x+5y2z=7(1)(2)(3)

1、利用行列式计算

D = ∣ 1 2 3 2 − 4 1 3 5 − 2 ∣ = 83 D=\left| \begin{matrix} 1 & 2 & 3\\ 2 & -4 & 1 \\ 3 & 5 & -2 \\ \end{matrix} \right|=83 D= 123245312 =83

D 1 = ∣ 14 2 3 − 3 − 4 1 7 5 − 2 ∣ = 83 D_1=\left| \begin{matrix} 14 & 2 & 3\\ -3 & -4 & 1 \\ 7 & 5 & -2 \\ \end{matrix} \right|=83 D1= 1437245312 =83

D 2 = ∣ 1 14 3 2 − 3 1 3 7 − 2 ∣ = 166 D_2=\left| \begin{matrix} 1 & 14 & 3\\ 2 & -3 & 1 \\ 3 & 7 & -2 \\ \end{matrix} \right|=166 D2= 1231437312 =166

D 3 = ∣ 1 2 14 2 − 4 − 3 3 5 7 ∣ = 249 D_3=\left| \begin{matrix} 1 & 2 & 14\\ 2 & -4 & -3 \\ 3 & 5 & 7 \\ \end{matrix} \right|=249 D3= 1232451437 =249

据克莱姆法则得:
x = D 1 D = 83 83 = 1 x=\displaystyle \frac{D_1}{D}=\frac{83}{83}=1 x=DD1=8383=1
y = D 2 D = 166 83 = 2 y=\displaystyle \frac{D_2}{D}=\frac{166}{83}=2 y=DD2=83166=2
z = D 3 D = 249 83 = 3 z=\displaystyle \frac{D_3}{D}=\frac{249}{83}=3 z=DD3=83249=3
{ x = 1 y = 2 z = 3 \begin{cases} x=1\\ y=2\\ z=3 \end{cases} x=1y=2z=3

  • 利用NumPy来计算
import numpy as np

D = np.linalg.det(np.matrix('1,2,3; 2,-4,1; 3,5,-2'))
D1 = np.linalg.det(np.matrix('14,2,3; -3,,-4,1; 7,5,-2'))
D2 = np.linalg.det(np.matrix('1,14,3; 2,-3,1; 3,7,-2'))
D3 = np.linalg.det(np.matrix('1,2,14; 2,-4,-3; 3,5,7'))

x = D1 / D
y = D2 / D
z = D3 / D

print('x = %.2f\ny = %.2f\nz = %.2f' %(x, y, z))

在这里插入图片描述

2、利用矩阵计算

[ 1 2 3 2 − 4 1 3 5 − 2 ] [ x y z ] = [ 14 − 3 7 ] \left[ \begin{matrix} 1 & 2 & 3 \\ 2 & -4 & 1\\ 3 & 5 & -2 \\ \end{matrix} \right] \left[ \begin{matrix} x \\ y\\ z \\ \end{matrix} \right] =\left[ \begin{matrix} 14 \\ -3\\ 7 \\ \end{matrix} \right] 123245312 xyz = 1437

A = [ 1 2 3 2 − 4 1 3 5 − 2 ] , X = [ x y z ] , B = [ 14 − 3 7 ] A=\left[ \begin{matrix} 1 & 2 & 3 \\ 2 & -4 & 1\\ 3 & 5 & -2 \\ \end{matrix} \right] ,X=\left[ \begin{matrix} x \\ y\\ z \\ \end{matrix} \right] ,B=\left[ \begin{matrix} 14 \\ -3\\ 7 \\ \end{matrix} \right] A= 123245312 ,X= xyz ,B= 1437

A X = B ⟹ X = A − 1 B = [ 0.03614458 0.22891566 0.1686747 0.08433735 − 0.13253012 0.06024096 0.26506024 0.01204819 − 0.09638554 ] [ 14 − 3 7 ] = [ 1 2 3 ] AX=B\Longrightarrow X=A^{-1}B =\left[ \begin{matrix} 0.03614458 & 0.22891566 & 0.1686747 \\ 0.08433735 & -0.13253012 & 0.06024096\\ 0.26506024 & 0.01204819 & -0.09638554 \\ \end{matrix} \right] \left[ \begin{matrix} 14 \\ -3\\ 7 \\ \end{matrix} \right] =\left[ \begin{matrix} 1\\ 2\\ 3 \\ \end{matrix} \right] AX=BX=A1B= 0.036144580.084337350.265060240.228915660.132530120.012048190.16867470.060240960.09638554 1437 = 123

  • 利用NumPy计算
import numpy as np

A = np.matrix('1,2,3; 2,-4,1; 3,5,-2')
B = np.matrix('14; -3; 7')
X = np.linalg.solve(A, B)

print('x = %.2f\ny = %.2f\nz = %.2f' %(X[0], X[1], X[2]))

在这里插入图片描述

十、随机数模块

  • NumPy的numpy.random模块相较于Python内置的random模块,扩展了更多生成随机数的功能,尤其适用于高效创建满足多种概率分布样本的数组。rand()函数能够生成指定维度的均匀分布浮点数数组。此外,该模块包含一系列用于产生特定分布随机数的函数,如设定随机数生成起始点的seed()、生成均匀整数的randint()、模拟正态分布数据的normal()、遵循Beta分布的beta()以及在[0,1]区间内均匀分布的uniform()等。通过设置seed()可以确保随机数序列的可复现性,而不同参数或无参数调用时则会生成不同的随机数序列。例如,np.random.normal()可用于生成符合正态分布特性的数值样本,其参数分别控制均值、标准差和生成样本的数量。

(一)rand()函数

  • rand()函数隶属于numpy.random模块,它的作用是随机生成N维浮点数组。
  • 随机生成一个二维数组
    在这里插入图片描述

(二)其它函数

  • random模块中还包括了可以生成服从多种概率分布随机数的其它函数。
函数描述
seed生成随机数的种子
rand产生均分分布的样本值
randint从给定的上下限范围内随机选取整数
normal产生正态分布的样本值
beta产生Beta分布的样本值
uniform产生在[0, 1]中的均匀分布的样本值
  • seed()函数可以保证生成的随机数具有可预测性,也就是说产生的随机数相同。
numpy.random.seed(seed=None)
  • 上述函数中只有一个seed参数,用于指定随机数生成时所用算法开始的整数值。

  • 当调用seed()函数时,如果传递给seed参数的值相同,则每次生成的随机数都是一样的。

  • 当传递的参数值不同或者不传递参数时,则seed()函数的作用跟rand()函数相同,即多次生成随机数且每次生成的随机数都不同。
    在这里插入图片描述

  • 使用np.random.normal(mean, scale, size)可以生成很多数值呈正态分布数字。mean就是中间竖线的位置,scale就是横向挤压或拉伸程度,size是生成数字个数。
    在这里插入图片描述

十一、本节小结

  • 本节全方位解析NumPy库,重点讲解了ndarray数组的属性、运算规则、索引切片技巧及变形操作,并深入介绍了ufuncs、线性代数功能和随机数生成模块,旨在助用户高效处理大型数据集、实现复杂分析与计算,为数据分析、机器学习等应用奠定坚实基础。

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

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

相关文章

父元素flex:1 高度却被子元素撑开的问题

问题 当父元素设置了flex: 1; 的情况下&#xff0c;想在其中子元素超出父元素高度的情况下&#xff0c;产生滚动条&#xff0c;在父元素区域滚动。由于子元素高度不固定&#xff0c;故父元素设置为display: flex; flex-direction: column; 子元素设置flex: 1; overflow: auto;…

select的change方法如何传递多个参数

element-ui中select的change方法传递多个参数 element-ui中的select&#xff0c;checkbox等组件的change方法的回调函数只有当前选择的val&#xff0c;如果想再传入自定义参数怎么办&#xff1f; 不能够传入自定义的参数&#xff0c;在进行某些操作时&#xff0c;会比较困难&…

【Java程序设计】【C00179】基于SSM的电影在线购票管理系统(论文+PPT)

基于SSM的电影在线购票管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的电影在线购票管理系统 本系统分为前台用户和后台管理员2个功能模块。 前台用户&#xff1a;当游客打开系统的网址后&#xff0c;首先看到…

【开源】基于JAVA+Vue+SpringBoot的用户画像活动推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 兴趣标签模块2.3 活动档案模块2.4 活动报名模块2.5 活动留言模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 数据流程设计3.4 E-R图设计 四、系统展示五、核心代码5.1 查询兴趣标签5.2 查询活动推荐…

一张图搞清楚HTTP状态码

HTTP状态码的基本概念 在客户端和服务器连接交互的时候&#xff0c;一般是客户端先给服务器发送请求&#xff0c;然后服务器返回结果。客户端和服务器之间的交互非常频繁&#xff0c;涉及到很多种不同类型的操作&#xff0c;大多数的时候服务器能成功返回结果&#xff0c;有时…

Vue3使用setup-extend简化组件名写法

如果我们在Vue3中要使用setup的语法糖&#xff0c;就需要使用两个script标签&#xff0c;一个用于设置组件的name属性&#xff0c;一个用于编写setup中的代码。如下&#xff1a; 但是我们有觉得光是因为一个name属性就多写一个script标签有点麻烦了。 因此我们可以使用插件来进…

[每日一题] 01.30

文章目录 数列求和质数口袋奇怪数求和 数列求和 n int(input()) print(sum([i for i in range(1,n 1)]))质数口袋 n int(input()) i 2 sum 0 count 0 while n - i > sum:flag Truefor j in range(2,i): # 判断i是否为素数if i % j 0:flag Falsebreakif flag:sum i…

如何解决 DNS 解析错误(DNS_PROBE_FINISHED_NXDOMAIN)问题

如何解决 DNS 解析错误&#xff08;DNS_PROBE_FINISHED_NXDOMAIN&#xff09;问题 导语&#xff1a; 当你在访问网站时遇到 DNS 解析错误&#xff08;DNS_PROBE_FINISHED_NXDOMAIN&#xff09;时&#xff0c;可能是由于本地 DNS 缓存导致的问题。这里介绍一种简单且常见的解决…

MongoDB安装以及卸载

查询id&#xff1a; docker ps [rootlocalhost ~]# docker stop c7a8c4ac9346 c7a8c4ac9346 [rootlocalhost ~]# docker rm c7a8c4ac9346 c7a8c4ac9346 [rootlocalhost ~]# docker rmi mongo sudo docker pull mongo:4.4 sudo docker images 卸载旧的 sudo docker stop mong…

【Linux】vim的简单使用

我们知道在Windows下的VS2019是一个集成开发环境&#xff0c;也就是说&#xff0c;集编辑&#xff0c;编译&#xff0c;调试等功能都放在了一起&#xff1b;但是在Linux下&#xff0c;这些步骤都是分开的&#xff0c;我们这篇博客就来说一说vim这个编辑器&#xff0c;它只有编辑…

Focaler-IoU:更聚焦的IoU损失

摘要 边界框回归在目标检测领域中起着至关重要的作用&#xff0c;而目标检测的定位精度在很大程度上取决于边界框回归的损失函数。现有的研究通过利用边界框之间的几何关系来提高回归性能&#xff0c;而忽略了难易样本分布对边界框回归的影响。本文分析了难易样本分布对回归结…

Kotlin基础——高阶函数和内联函数

高阶函数 高阶函数以另一个函数作为参数或者返回值&#xff0c;其可用Lambda或函数引用表示 函数类型 下面将Lambda存储在sum变量中&#xff0c;其是函数类型 val sum { x: Int, y: Int -> x y }完整的函数类型为(para1,prar2…) -> returnValue val a: Int 0 va…

【MBtiles数据索引和服务发布】GeoServer改造Springboot番外系列二

xyz地图服务访问示例&#xff1a;http://192.168.1.240:8081/gmserver/raster/xyz/firstWP:Imagery-raster/{z}/{x}/{y}.jpg 访问示例如下&#xff1a; mbtiles目录结构 根据z&#xff0c;x&#xff0c;y获取对应mbtiles文件路径的工具方法 说明&#xff1a;重点是使用getMb…

堆宝塔

L2-1 堆宝塔 分数 25 作者 陈越 单位 浙江大学 堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小&#xff0c;按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。聪明…

第六讲_JavaScript原型

JavaScript原型 1. 原型的概念2. 原型继承2.1 原型链 3. class类的原型对象 1. 原型的概念 原型是 JavaScript 对象相互继承特性的机制。 每个函数都有一个 prototype 属性&#xff0c;这个属性指向一个对象&#xff0c;这个对象称为原型对象。每个对象都有一个 [[Prototype]…

在线mockjson

在线mockjson体验地址 在调一个问题的时候&#xff0c;但是问题的数据可能并不能随着想到的场景就变化&#xff0c;譬如说又个数组长度的情况&#xff0c;可能默认的情况下是返回4个元素&#xff0c;但是想要返回为空的时候&#xff0c;如果联系服务给改一下&#xff0c;那么流…

Pyecharts炫酷热力图:参数详解与实战大揭秘

Pyecharts绘制多种炫酷热力图参数说明代码实战 引言 热力图在数据可视化中是一种强大的工具&#xff0c;可以直观地展示数据的分布情况和变化趋势。Pyecharts是一个基于Echarts的Python可视化库&#xff0c;提供了丰富的图表类型&#xff0c;包括热力图。在本文中&#xff0c…

防御保护---防火墙的NAT-easyip

文章目录 目录 文章目录 点击此处查看NAT技术详解 一.NAT分类 二.防火墙配置 一对多NAT配置 多对多NAT配置 练习 点击此处查看NAT技术详解 一.NAT分类 源IP-NAT(源IP与公网之间转换)&#xff1a;静态NAT&#xff0c;动态NAT&#xff0c;NAPT&#xff1b;使内网能够访问公网目…

Linux网络编程——网络初识

文章目录 1. 网络协议初识1.1 为什么要有网络协议1.2 协议分层 2. OSI七层模型3. TCP/IP五层&#xff08;或四层&#xff09;模型4. 网络传输基本流程5. 以太网通信 1. 网络协议初识 1.1 为什么要有网络协议 早期计算机是独立的&#xff0c;如果要进行数据交互&#xff0c;就…

安装好IntelliJ IDEA点击无反应,如何解决配置文件不一致导致的启动问题

在我们的开发生涯中&#xff0c;遇到IDE工具出现问题是在所难免的。最令人头疼的莫过于&#xff0c;你的IDEA(IntelliJ IDEA)无法启动&#xff0c;而且没有任何错误提示。这篇文章将详细讲解如何解决IntelliJ IDEA 2023.3.3版本启动失败的问题&#xff0c;这个问题可能也适用于…