NumPy是Python中用于数值计算的核心库,其中
ndarray
(n维数组)为其主要数据结构,提供高效存储和处理多维数据的能力。通过array()
函数、zeros()
、ones()
等方法创建数组,并可指定数据类型如int32或float64。数组支持矢量化运算、广播机制以及与标量运算,简化了大量数学计算操作。利用索引和切片技术可以访问和修改数组元素,包括整数索引、切片索引、花式索引和布尔型索引。此外,NumPy提供了转置、轴对称变换以及通用函数如sum()
、mean()
等进行统计计算,还有排序、唯一化及集合逻辑操作。其linalg
模块涵盖了线性代数相关功能,如矩阵乘法、求逆、解方程组等。随机数生成方面,random
模块可产生各种概率分布的随机数,助力模拟实验和数据分析。
属性 | 具体说明 |
---|---|
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 |
array()
函数将列表或元组转换为数组。其次,zeros()
和ones()
分别生成元素全为0或1的数组,而empty()
则创建一个未初始化(随机填充)的数组。另外,通过arange()
可以创建等差数列组成的数组,类似Python内置的range()
但返回结果是数组类型。最后,注意数组中的元素显示形式,如1
与1.
的区别源于元素的数据类型差异。1
和1.
,产生这种现象,主要是因为元素的数据类型不同所导致的。ndarray.dtype.name
可查看具体类型名称。数组创建时,默认如zeros、ones等函数生成float64类型数据,在不同系统上整数默认长度可能不同(int32或int64)。支持多种数据类型包括布尔、整型、浮点型、复数以及对象和字符串等,并可通过dtype参数指定。转换数据类型使用astype()
方法,例如将整型数组转为浮点型。特征码提供了一种简写形式标识数据类型。通过zeros()、ones()、empty()函数创建的数组,默认的数据类型为float64。
默认情况下,64位windows系统输出的结果为int32,64位Linux或macOS系统输出结果为int64,当然也可以通过dtype来指定数据类型的长度。
数据类型 | 含义 |
---|---|
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位浮点数表示实部和虚部 |
object | Python对象 |
stirng_ | 固定长度的字符串类型 |
uncode_, str_ | 固定长度的unicode类型 |
特征码 | 含义 |
---|---|
b | 布尔型 |
u | 无符号整型 |
c | 复数类型 |
S, a | 字节字符串 |
V | 原始数据 |
i | 有符号整型 |
f | 浮点型 |
O | Python对象 |
U | unicode字符串 |
(行号, 列号)
访问特定元素,而切片可按需选取部分行或列。此外,ndarray特有的花式索引允许使用整数数组或列表选择多处数据,并能混合使用整数索引和切片。布尔型索引则根据布尔数组选取对应为True的元素。这些灵活的索引方式极大地增强了对多维数组数据的操作能力。对于多维数组来说,索引和切片的使用方式与列表就大不一样了
在二维数组中,每个索引位置上的元素不再是一个标量了,而是一个一维数组。
花式索引是NumPy的一个术语,是指用整数数组或列表进行索引,然后再将数组或列表中的每个元素作为下标进行取值。
当使用一个数组或列表作为索引时,如果使用索引要操作的对象是一维数组,则获取的结果是对应下标的元素。
如果要操作的对象是一个二维数组,则获取的结果就是对应下标的一行数据。
如果用两个花式索引操作数组,则会将第1个作为行索引,第2个作为列索引,以二维数组索引的方式选取其对应位置的元素。
当使用transpose()方法对数组的shape进行调换时,需要以元组的形式传入shape的编号,比如(1, 0, 2)。
如果我们不输入任何参数,直接调用transpose()
方法,则其执行的效果就是将数组进行转置,作用等价于transpose(2, 1, 0)
。
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 | 执行元素级的比较运算,最终产生布尔型数组,相当于运算符>、≥、<、≤、==、!= |
where()
函数实现条件逻辑的向量化,进行元素级选择赋值。统计运算如求和、平均、最大最小值以及它们对应的索引等操作简单易行。数组排序可使用sort()
方法,并指定轴参数对特定维度排序。通过all()
和any()
函数可快速判断数组内所有或任一元素是否满足条件。此外,NumPy还支持集合逻辑操作,如唯一化(unique()
)、交集(intersect1d()
)、并集(union1d()
)和差集(setdiff1d()
)等,便于高效处理集合关系。利用这些功能,用户能便捷地完成各类复杂的数据分析任务。方法 | 描述 |
---|---|
sum | 对数组中全部或某个轴向的元素求和 |
mean | 算术平均值 |
min | 计算数组中的最小值 |
max | 计算数组中的最大值 |
argmin | 表示最小值的索引 |
argmax | 表示最大值的索引 |
cumsum | 所有元素的累计和 |
cumprod | 所有元素的累计积 |
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()
方法实现高效精确计算。此外,该模块还支持对角线操作、迹计算以及特征值和奇异值分解等功能,满足不同场景下的矩阵分析需求。
例如,矩阵相乘,如果我们通过“*”对两个数组相乘的话,得到的是一个元素级的积,而不是一个矩阵点积。
矩阵点积的条件是矩阵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=A⋅B=k=1∑paikbkj=ai1b1j+ai2b2j+……+aipbpj
除此之外,linalg
模块中还提供了其他很多有用的函数。
函数 | 描述 |
---|---|
dot | 矩阵乘法 |
diag | 以一维数组的形式返回方阵的对角线,或将一维数组转为方阵 |
trace | 计算对角线元素和 |
det | 计算方阵的行列式 |
eig | 计算方阵的特征值和特征向量 |
inv | 计算方阵的逆 |
qr | 计算qr分解 |
svd | 计算奇异值 |
solve | 解线性方程组AX=b,其中A是一个方阵 |
lstsq | 计算AX=b的最小二乘解 |
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= 1232−4531−2 =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= 14−372−4531−2 =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= 12314−3731−2 =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= 1232−4514−37 =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
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))
[ 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] 1232−4531−2 xyz = 14−37
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= 1232−4531−2 ,X= xyz ,B= 14−37
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=B⟹X=A−1B= 0.036144580.084337350.265060240.22891566−0.132530120.012048190.16867470.06024096−0.09638554 14−37 = 123
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.random
模块相较于Python内置的random模块,扩展了更多生成随机数的功能,尤其适用于高效创建满足多种概率分布样本的数组。rand()
函数能够生成指定维度的均匀分布浮点数数组。此外,该模块包含一系列用于产生特定分布随机数的函数,如设定随机数生成起始点的seed()
、生成均匀整数的randint()
、模拟正态分布数据的normal()
、遵循Beta分布的beta()
以及在[0,1]区间内均匀分布的uniform()
等。通过设置seed()
可以确保随机数序列的可复现性,而不同参数或无参数调用时则会生成不同的随机数序列。例如,np.random.normal()
可用于生成符合正态分布特性的数值样本,其参数分别控制均值、标准差和生成样本的数量。函数 | 描述 |
---|---|
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
是生成数字个数。
ndarray
数组的属性、运算规则、索引切片技巧及变形操作,并深入介绍了ufuncs、线性代数功能和随机数生成模块,旨在助用户高效处理大型数据集、实现复杂分析与计算,为数据分析、机器学习等应用奠定坚实基础。