7.数组运算
a.数组运算的通用函数
函数 | 说明 |
numpy.sqrt(array) | 平方根函数 |
numpy.exp(array) | e^array[i]的数组 |
numpy.abs/fabs(array) | 计算绝对值 |
numpy.square(array) | 计算各元素的平方 等于array**2 |
numpy.log/log10/log2(array) | 计算各元素的各种对数 |
numpy.sign(array) | 计算各元素正负号 |
numpy.isnan(array) | 计算各元素是否为NaN |
numpy.isinf(array) | 计算各元素是否为无穷大 |
numpy.cos/cosh/sin/sinh/tan/tanh(array) | 三角函数 |
numpy.modf(array) | 将array中值得整数和小数分离,作两个数组返回 |
numpy.ceil(array) | 向上取整,也就是取比这个数大的整数 |
numpy.floor(array) | 向下取整,也就是取比这个数小的整数 |
numpy.rint(array) | 四舍五入 |
numpy.trunc(array) | 向0取整 |
numpy.add(array1,array2) | 元素级加法 |
numpy.subtract(array1,array2) | 元素级减法 |
numpy.multiply(array1,array2) | 元素级乘法 |
numpy.divide(array1,array2) | 元素级除法 array1./array2 |
numpy.power(array1,array2) | 元素级指数 array1.^array2 |
numpy.maximum/minimum(array1,aray2) | 元素级最大值、最小值 |
numpy.fmax/fmin(array1,array2) | 元素级最大值,最小值(忽略NaN) |
numpy.mod(array1,array2) | 元素级求模 |
numpy.mod(array1,array2) | 元素级求模 |
numpy.copysign(array1,array2) | 将第二个数组中值得符号复制给第一个数组中值 |
b.广播机制
广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行。
当运算中的 2 个数组的形状不同时,numpy 将自动触发广播机制:
import numpy as np a = np.array([[ 0, 0, 0], [10,10,10], [20,20,20], [30,30,30]]) b = np.array([1,2,3]) a + b
广播的规则:
让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加 1 补齐。
输出数组的形状是输入数组形状的各个维度上的最大值。
如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为 1 时,这个数组能够用来计算,否则出错。
当输入数组的某个维度的长度为 1 时,沿着此维度运算时都用此维度上的第一组值。
b.数组的算数运算
数组和数的运算
numpy的广播机制在运算过程中,加减乘除的值被广播到所有的元素上。
t1 = np.arange(24).reshape(6,4) t1+2 t1*2 t1/2 t1-2
数组与数组的运算
同种形状的数组(对应位置进行计算操作)
如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数(ndim)相同,且各维度的长度(shape)相同。
t1 = np.arange(24).reshape((6,4)) t2 = np.arange(100,124).reshape((6,4)) t1+t2 t1*t2 t1-t2 t1/t2
不种形状的多维数组计算
# 行数不同,列数相同,不能进行算术运算 t1 = np.arange(24).reshape((4,6)) t2 = np.arange(18).reshape((3,6)) t1 t2 t1-t2 # 提示什么错误? # ValueError: operands could not be broadcast together with shapes (4,6) (3,6) # 行数相同,列数不同,可以进行运算 t1 = np.arange(24).reshape((4,6)) t2 = np.arange(4).reshape((4,1)) t1-t2
行数或者列数相同的一维数组和多维数组可以进行计算:
列形状相同(会与每一个相同维度的数组的对应位相操作)
t1 = np.arange(24).reshape((4,6)) t2 = np.arange(0,6) t1-t2
行形状相同(会与每一个相同维度的数组的对应位相操作)
行数相同时数组为二维数组
数组上的算术运算符适用于elementwise(对应位置元素逐个相乘)
import numpy a = np.array([20,30,40,50]) b = np.arange(4) # 算术运算 c = a - b c #? b ** 2 #? 10 * np.sin(a) #?
增强运算
某些操作(例如+=和)*=就位以修改现有数组,而不是创建一个新数组
rg = np.random.default_rng(1) a = np.ones((2,3),dtype=int) b = rg.random((2,3)) a*3 a #? b += a b #? a += b
也可以看看,其他有关数学运算的函数:
all, any, apply_along_axis, argmax, argmin, argsort, average, bincount, ceil, clip, conj, corrcoef, cov, cross, cumprod, cumsum, diff, dot, floor, inner, invert, lexsort, max, maximum, mean, median, min, minimum, nonzero, outer, prod, re, round, sort, std, sum, trace, transpose, var, vdot, vectorize, where
c.矩阵运算
与许多矩阵语言不同,乘积运算符*在NumPy数组中按元素进行操作。可以使用@运算符(在python> = 3.5中)或dot函数或方法执行矩阵乘积:
a = np.array([[1,1],[0,1]]) b = np.array([[2,0],[3,4]]) a * b #? a @ b #? a.dot(b) #?
d.数学函数
通用功能:NumPy提供了熟悉的数学函数,例如sin,cos和exp。在NumPy中,这些被称为“通用函数”(ufunc)。在NumPy中,这些函数在数组上逐个元素操作,生成数组作为输出。
b = np.arange(3) np.exp(b) np.sqrt(b) c = np.array([2.,-1.,1.41421356]) np.add(b,c) #?
e.统计函数
函数 | 说明 |
np.sum() | 计算数组的和 |
np.mean() | 返回数组中元素的算术平均值 |
np.average() | 根据在另一个数组中给出的各自的权重计算数组中元素的加权平均值 |
np.std() | 计算数组标准差 |
np.var() | 计算数组方差 |
np.min() | 计算数组中的元素沿指定轴的最小值 |
np.max() | 计算数组中的元素沿指定轴的最大值 |
np.argmin() | 返回数组最小元素的索引 |
np.argmax() | 返回数组最大元素的索引 |
np.cumsum() | 计算所有元素的累计和 |
np.cumprod() | 计算所有元素的累计积 |
np.ptp() | 计算数组中元素最大值与最小值的差(最大值 - 最小值) |
np.median() | 计算数组中元素的中位数(中值) |
import numpy as np score = np.array([[80,88],[82,81],[75,81]]) # 1. 获取所有数据最大值 result = np.max(score) # 2. 获取某一个轴上的数据最大值 result = np.max(score,axis=0) # 3. 获取最小值 result = np.min(score) # 4. 获取某一个轴上的数据最小值 result = np.min(score,axis=0) # 5. 数据的比较 result = np.maximum([-2, -1, 0, 1, 2], 0) # 第一个参数中的每一个数与第二个参数比较返回大的 result = np.minimum([-2, -1, 0, 1, 2], 0) # 第一个参数中的每一个数与第二个参数比较返回小的 result = np.maximum([-2, -1, 0, 1, 2], [1,2,3,4,5]) # 接受的两个参数,也可以大小一致; 第二个参数只是一个单独的值时,其实是用到了维度的广播机制; # 6. 求平均值 result = np.mean(score) # 获取所有数据的平均值 result = np.mean(score,axis=0) # 获取某一行或者某一列的平均值 # 7. 返回给定axis上的累计和 arr = np.array([[1,2,3], [4,5,6]]) arr arr.cumsum(0) arr.cumsum(1) # 8. argmin求最小值索引 result = np.argmin(score,axis=0) result # 9. 求每一列的标准差 # 标准差是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间差异较大; # 一个较小的标准差,代表这些数据较接近平均值反应出数据的波动稳定情况,越大表示波动越大,越不稳 定。 result = np.std(score,axis=0) result # 10. 极值 # np.ptp(t,axis=None)就是最大值和最小值的差 # 拓展:方差var, 协方差cov, 计算平均值 average, 计算中位数 median
numpy.argmax() 和 numpy.argmin()函数分别沿给定轴返回最大和最小元素的索引:
import numpy as np a = np.array([[30,40,70],[80,20,10],[50,90,60]]) a # 调用 argmax() 函数 np.argmax(a) # 展开数组: a.flatten() # 沿轴 0 的最大值索引 maxindex = np.argmax(a, axis=0) maxindex # 沿轴 1 的最大值索引: maxindex = np.argmax(a, axis=1) maxindex # 调用 argmin() 函数: minindex = np.argmin(a) minindex # 展开数组中的最小值: a.flatten()[minindex] # 沿轴 0 的最小值索引: minindex = np.argmin(a, axis=0) minindex # 沿轴 1 的最小值索引: minindex = np.argmin(a, axis=1) minindex
f.字符串函数
对 dtype 为 numpy.string_ 或 numpy.unicode_ 的数组执行向量化字符串操作。
这些函数在字符数组类(numpy.char)中定义
函数 | 描述 |
add() | 对两个数组的逐个字符串元素进行连接 |
multiply() | 返回按元素多重连接后的字符串 |
center() | 居中字符串 |
capitalize() | 将字符串第一个字母转换为大写 |
title() | 将字符串的每个单词的第一个字母转换为大写 |
lower() | 数组元素转换为小写 |
upper() | 数组元素转换为大写 |
split() | 指定分隔符对字符串进行分割,并返回数组列表 |
splitlines() | 返回元素中的行列表,以换行符分割 |
strip() | 移除元素开头或者结尾处的特定字符 |
join() | 通过指定分隔符来连接数组中的元素 |
replace() | 使用新字符串替换字符串中的所有子字符串 |
decode() | 数组元素依次调用str.decode |
encode() | 数组元素依次调用str.encode |
numpy.char.add() # 函数依次对两个数组的元素进行字符串连接 numpy.char.multiply() # 函数执行多重连接 numpy.char.center() # 函数用于将字符串居中,并使用指定字符在左侧和右侧进行填充 numpy.char.capitalize() # 函数将字符串的第一个字母转换为大写 numpy.char.title() # 函数将字符串的每个单词的第一个字母转换为大写 numpy.char.lower() # 函数对数组的每个元素转换为小写。它对每个元素调用 str.lower numpy.char.upper() # 函数对数组的每个元素转换为大写。它对每个元素调用 str.upper numpy.char.split() # 通过指定分隔符对字符串进行分割,并返回数组。默认情况下,分隔符为空格 numpy.char.splitlines() # 函数以换行符作为分隔符来分割字符串,并返回数组 numpy.char.strip() # 函数用于移除开头或结尾处的特定字符 numpy.char.join() # 函数通过指定分隔符来连接数组中的元素或字符串 numpy.char.replace() # 函数使用新字符串替换字符串中的所有子字符串 numpy.char.encode() # 函数对数组中的每个元素调用 str.encode 函数。 默认编码是 utf-8,可以使用标准 Python 库中的编解码器 numpy.char.decode() # 函数对编码的元素进行 str.decode() 解码
g.排序函数
numpy.sort() 函数返回输入数组的排序副本
numpy.sort(a, axis, kind, order)
参数 | 说明 |
a | 要排序的数组 |
axis | 沿着它排序数组的轴 |
kind | 默认为(快速排序) |
order | 如果数组包含字段,则是要排序的字段 |
import numpy as np a = np.array([[3,7],[9,1]]) a print ('调用 sort() 函数:') np.sort(a) np.sort(a, axis=0) np.sort(a, axis=1) # 在 sort 函数中排序字段 dt = np.dtype([('name', 'S10'),('age', int)]) a = np.array([("raju",21),("anil",25),("ravi", 17), ("amar",27)], dtype = dt) a np.sort(a, order='name')
h.条件筛选函数
g.文件读写
NumPy文件读写主要有二进制的文件读写和文件列表形式的数据读写两种形式
np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
参数 | 说明 |
fname | 文件,字符串或产生器,可以是.gz或bz2压缩文件 |
dtype | 数据类型,可选,默认为np.float |
delimiter | 分隔字符串,默认是任何空格,改为逗号 |
skiprows | 跳过前x行,一般跳过第一行表头 |
usecols | 读取指定的列,索引,元组类型 |
unpack | 如果为True,读入属性将分别写入不同数组变量,False读入数据只写入一个数组变量,默认False |
三、numpy-矩阵专题
矩阵是numpy.matrix类型的对象,该类继承自numpy.ndarray,任何针对多维数组的操作,对矩阵同样有效,但是作为子类矩阵又结合其自身的特点,做了必要的扩充,比如:乘法计算、求逆等。
1. 矩阵对象的创建
# 等价于:numpy.matrix(..., copy=False)
# 由该函数创建的矩阵对象与参数中的源容器一定共享数据,无法拥有独立的数据拷贝
numpy.mat(任何可被解释为矩阵的二维容器)
# 该函数可以接受字符串形式的矩阵描述:
# 数据项通过空格分隔,数据行通过分号分隔。例如:'1 2 3; 4 5 6'
numpy.mat(拼块规则)
示例:创建matrix
# 创建matrix操作 import numpy as np arr = np.arange(1, 10).reshape(3, 3) arr # 第一种方式 m = np.matrix(arr, copy=True) m m.shape type(m) # 第二种方式:共享方式 m2 = np.mat(arr) m2 # 第三种方式 m3 = np.mat("1 2 3;4 5 6.0") m3
2. 矩阵的乘法运算
# 矩阵乘法 import numpy as np arr = np.array([[1, 1, 1], [2, 2, 2], [3, 3, 3]]) # 数组相乘, 各对应位置元素相乘 arr * arr # 矩阵相乘,第n行乘m列之和,作为结果的n, m个元素 # 矩阵相乘,第一个矩阵列数必须等于第二个矩阵行数 m = np.mat(arr) m * m
3. 矩阵的逆矩阵
若两个矩阵A、B满足:AB = E (E为单位矩阵),则称B为A的逆矩阵。
单位矩阵
在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,这种矩阵被称为单位矩阵。它是个方阵,从左上角到右下角的对角线(称为主对角线)上的元素均为1,除此以外全都为0,记为
通常用I或E来表示。根据单位矩阵的特点,任何矩阵与单位矩阵相乘都等于本身,而且单位矩阵因此独特性有广泛用途。以下是一个单位矩阵示例:
逆矩阵示例:
e = np.mat("1 2 6; 3 5 7; 4 8 9") print(e.I) print(e * e.I)
注意:在计算过程中,可能出现如下错误,说明该矩阵不可逆。
numpy.linalg.LinAlgError: Singular matrix
4. ndarray提供的矩阵API
ndarray提供了方法让多维数组替代矩阵的运算:
a = np.array([ [1, 2, 6], [3, 5, 7], [4, 8, 9]]) # 点乘法求ndarray的点乘结果,与矩阵的乘法运算结果相同 k = a.dot(a) k # linalg模块中的inv方法可以求取a的逆矩阵 l = np.linalg.inv(a) l
5. 矩阵应用
案例:解线性方程组
假设一帮孩子和家长出去旅游,去程坐的是bus,小孩票价为3元,家长票价为3.2元,共花了118.4;回程坐的是Train,小孩票价为3.5元,家长票价为3.6元,共花了135.2。分别求小孩和家长的人数。使用矩阵求解。表达成方程为:
表示成矩阵相乘:
import numpy as np # 解方程 prices = np.mat('3 3.2; 3.5 3.6') totals = np.mat('118.4; 135.2') x = np.linalg.lstsq(prices, totals)[0] # 求最小二乘解 x x = np.linalg.solve(prices, totals) # 求解线性方程的解 x x = prices.I * totals # 利用矩阵的逆进行求解 x
四、numpy-概率论专题
numpy提供了random模块生成服从特定统计规律的随机数序列
1.随机抽样(np.random)
函数 | 描述 |
np.random.randint() | 返回随机整数,左闭右开区间 [low, high) |
np.random.randn() | 返回一个样本,具有标准正态分布 |
np.random.rand() | 随机样本位于[0, 1)中 |
np.random.random_integers() | 返回随机的整数,位于闭区间 [low, high] |
np.random.random_sample() | 返回随机的浮点数,在半开区间 [0.0, 1.0) |
np.random.random() | 返回随机的浮点数,在半开区间 [0.0, 1.0) |
np.random.ranf() | 返回随机的浮点数,在半开区间 [0.0, 1.0) |
np.random.sample() | 返回随机的浮点数,在半开区间 [0.0, 1.0) |
np.random.choice() | 生成一个随机样本 |
np.random.bytes() | 返回随机字节 |
2.排列
函数 | 描述 |
np.random.shuffle(array) | 随机打乱顺序 |
np.random.permutation(array) | 返回一个随机排列 |
3.分布
函数 | 描述 |
binomial(n,p[,size]) | 二项分布的样本 |
exponential([scale,size]) | 指数分布 |
f((dfnum, dfden[, size])) | F分布样本 |
geometric(p[, size]) | 几何分布 |
hypergeometric(ngood, nbad, nsample[, size]) | 超几何分布样本 |
multinomial(n, pvals[, size]) | 多项分布 |
normal([loc, scale, size]) | 正态(高斯)分布 |
pareto(a[, size]) | 帕累托(Lomax)分布 |
poisson([lam, size]) | 泊松分布 |
standard_normal([size]) | 标准正态分布 (mean=0, stdev=1). |
uniform([low, high, size]) | 均匀分布 |