做网站 是不是懂ps/天津关键词优化专家

相关链接
- 官方API:Numpy
基本概念
import numpy as np
,是 Numpy 库约定的导入方式。ndarray
类型是 Numpy 最主要的类型。ndarray
对象的元素具有相同的类型,并且一般是 Numpy 自定义的一些类型(常用就几种,float64
,int64
,bool
)。ndarray
对象的元素的类型也可以不相同,但这会降低性能。- 如果创建
ndarray
对象时,不指定元素的类型,那么会自动判断。
注意
广播机制
假设 X
是个 2 * 5的矩阵,b
是个长度为 2 的列向量(shape=(2, 1)
),以线性代数来说,它们是无法相加的,但在 numpy 中可以,numpy 会自动将 X
的每一列加上 b
,相等于 X
加上了 5 个 b
组成的矩阵,这就是 numpy 的广播机制。
向量陷阱
创建两个随机数组:
a = np.random.randn(3)
b = np.random.randn(1, 3) # 指定行数为 1,这样变成了二维数组
它们的值分别为:
[-0.83225206 -0.09399222 -1.67005094] # 一对 [],秩为 1,不是向量,是一维数组
[[ 0.76575103 -0.74501314 -0.64075695]] # 两对 [],是向量,或者说二维数组
分别打印它们的 shape,结果为:
(3,) # 一维数组
(3, 1) # 二维数组
numpy 中表示一个向量,需要用二维数组,因为列向量,必须用二维数组表示。但用一维数据创建数组时,默认会用一维数组表示,我们需要用向量表示这些数据时,就必须 reshape
成二维的,或者使用 np.atleast_2d()
函数。
选取多个元素时,会用一维数组类型。同样的,函数输出一维数据时,会用一维数组类型,为了表示向量,可以指定参数 keepdims=True
,如 np.sum(b, axis=0, keepdims=True)
,来保留输出数组维度(这样二维数组输入数据,输出时就还是二维)。
因为本质是不同维度的数组,所以它们的在做某些运算时,行为是有很大不同的。例如 a.T @ a
,结果是一个常数。而 b.T @ b
的结果为一个矩阵(就是线性代数中矩阵乘法的运算规则)。
浮点类型的大于 0 比较
浮点数是不精确的,虽然显示 0.
,但可能要比 0 大,或小,所以 numpy 矩阵 a
执行 a > 0
操作,有的 0.
会是 True
,而有的会是 False
。
nan
和 inf
type(np.nan) # float
print(0 * np.nan) # nan
print(np.nan - np.nan) # nan
print(np.nan == np.nan) # False
print(np.nan is np.nan) # True
print(np.nan in set([np.nan])) # Truetype(np.inf) # float
print(np.inf == np.inf) # False
print(np.inf is np.inf) # Trueprint(np.inf > np.nan) # False
print(np.inf == np.nan) # False
print(np.inf < np.nan) # Falseprint(0.3 == 3 * 0.1) # False,因为 0.1 并不精确
相关操作
创建 ndarray
对象
用列表,元组等创建:
# 根据传入的类型,自动判断 dtype
np.array([1, 2, 3, 4])
# 指定 dtype
np.array((1, 2, 3, 4), dtype=np.int16)
# 支持列表,元组混合
np.array([[1,2], [3,4], (0.5,0.6)]) # 三维数组
用 Numpy 中的函数创建:
# 类似 range,但返回 ndarray 类型
np.arange([start,] stop[, step,], dtype=None)
# 1 到 10 之间(包括 10),均匀选取 4 个数据(1, 4, 7, 10)
np.linspace(1, 10, 4)
# 此时不包括 10
np.linspace(1, 10, 4, endpoint=False)
# 根据 shape 生成全为 1 的数组,这里指定了数据类型
np.ones((3, 6), dtype=np.int32)
# 根据 shape 生成全为 0 的数组
np.zeros(3)
# 根据 shape 生成全为 10 的数组
np.full((3,3,3), 10)
# 创建一个 5*5 的单位矩阵,对角线为 1,其余为 0
np.eye(5)# 合并 a,b 两个数组,返回一个新数组
np.concatenate((a, b))# 生成和 x 相同 shape 的全 1 数组
np.ones_like(x)
# 生成和 x 相同 shape 的全 0 数组
np.zeros_like(x)
# 生成和 x 相同 shape 的全 3 数组
np.full_like(x, 3)
随机生成:
# 指定随机数种子,相同的随机数种子,生成相同的随机数
np.random.seed(10)# 生成服从标准正态的随机数,shape 为 (3, 4, 5),常用
np.random.randn(3, 4, 5)
# 生成 0 到 1 之间随机浮点数,shape 为 (3, 4, 5)
np.random.rand(3, 4, 5)
# 根据 shape 生成 x 到 y 之间随机整数
np.random.randint(x, y, shape)
# 产生具有正态分布的数组,loc 均值,scale 标准差,size 数量
np.random.normal(loc, scale, size)
# 产生具有均匀分布的数组,low 起始值,high 结束值,size 数量
np.random.uniform(low, high, size)
# 产生具有泊松分布的数组,lam 随机事件发生率,size 数量
np.random.poisson(lam, size)
ndarray
对象的重要属性
# 各个维度的长度,是个元组
a.shape
# 维度数,等同 `len(a.shape)`
a.ndim
# 所有维度的总元素数量,即所有维度相乘
a.size
# 元素的类型
a.dtype
# 元素类型占用大小
a.itemsize
# 所有数据占用的大小,字节为单位,等于 a.size*a.itemsize
a.nbytes
ndarray
对象与维度有关的操作
转置:
# 返回转置后的 a,非原地
a.T
数组维度的变换(考虑维度变换时,先把原数组变为一维的,再考虑变换维度):
# 转为 3 行 4 列的数组,非原地
a.reshape(3, 4)
# 转为 2 面 3 行 4 列的数组,非原地
a.reshape(2, 3, 4)
# -1 指根据数组元素个数自动分配
a.reshape(3, -1)
# 跟 .reshape() 功能一致,但属原地操作,注意不能用 -1 表示法
a.resize(3, 4)
# 将 1(0+1)维和 2(1+1)维交换,有点难理解,配合实例去理解
a.swapaxes(0, 1)# 降维成一维数组,非原地
a.flatten()
# 删除 a 中所有为 1 的维度
# 如 `array([[[1, 2, 3]]])` 使用后会变成 `array([1, 2, 3])`
a.squeeze()
# 保证数据至少 1 维,如输入一个数字,会输出一个包含它的一维数组
# 如果输入数组就不发生变化
# 可以输入多个变量,返回 tuple
np.atleast_1d(1)
# 同上,至少二维
np.atleast_2d(a)# 根据 shape 将一维下标 index 转换成多维下标
np.unravel_index(index, shape)
ndarray
对象的选取方式
对象在选取后也可进行修改。
假设 a 是一维的:
# 选取第 4 个元素
a[3]
# 完全支持切片操作
a[1:10:2]
假设 a 是二维的:
"""选取单个数据"""
a[0, 1] # 选取第 1 行,第 2 个元素
a[0][1] # 另一种选取方式,但不推荐,实测比上面慢 1 倍左右
a[-1, -1] # 支持负索引"""选取多个数据"""
a[0] # 选取第 1 行
a[:,0] # 选取第 1 列
a[:,1:4] # 选取 2 到 4 列
a[:,(0,2)] # 选取第 1 和第 3 列,元组可以换成 list 或 ndarray 等类型
假设a是三维的:
"""选取单个数据"""
a[1, 2, 3] # 选取第 2 面,第 3 行,第 4 个元素
a[1][2][3] # 另一种选取方式,但不推荐,实测比上面慢 1 倍左右
a[-1, -2, -3] # 支持负索引"""选取多个数据"""
a[:, -1, 3] # 支持多维切片
a[:, 1:3, :]
a[:, :, ::2]
a[:,:,(0,2)] # 选取所有面第 1 和第 3 列,元组可以换成 list 或 ndarray 等类型
无论a是几维的,布尔选取:
# 选取所有大于 10 的数据
a[a>10]
# 选取所有大于 10 小于 20 的数据
a[(a>10)&(a<20)]
# 选取所有小于等于 10 或大于等于 20 的数据
a[(a<=10)|(a>=20)]
用方法选取元素:
# 不指定参数,选取数组中唯一一个元素,需要所有维度为 1
# 如 `array([[[1]]])` 中的 1
a.item()
# 维度转为 1 维后,选取第 10 个元素
a.item(9)
# 选取 3 维第 2 号,2 维第 3 号,3 维第 4 号元素
a.item((1,2,3))
ndarray
对象的运算
# 两个数组各元素间加减乘除模指数运算
+ - * / % **
# 比较,产生布尔型数组
> < >= <= == !=
Numpy 重要统计函数
这些不仅是 numpy 的函数,也都是 ndarray
对象的方法。并且大部分都可以指定 axis
,axis=0
指行,axis=1
指列。
# 返回 a 去重后的数组,类似 set()
np.unique(a)
# 返回数组 a 最大值
np.max(a)
# 返回数组 a 最小值
np.min(a)
# 返回数组 a 最大值的降成一维后的索引
np.argmax(a)
# 返回数组 a 最小值的降成一维后的索引
np.argmin(a)
# 返回 a 中最大值与最小值的差
np.ptp(a)
# 返回 a 中元素的中位数
np.median(a)
# 计算相关元素之和
np.sum(a)
# 计算相关元素的期望
np.mean(a)
# 计算相关元素的加权平均值
np.average(a, weights)
# 计算相关元素标准差
np.std(a)
# 计算相关元素方差
np.var(a)
# 以一维数组的形式返回矩阵的对角线(左上到右下)元素
np.diag(a)
# 计算对角线(左上到右下)元素的和,即迹
np.trace(a)
# 如果 a 中所有元素都为真,就返回 True,否则 False
np.all(a)
# 如果 a 中有任一元素都为真,就返回 True,否则 False
np.any(a)
Numpy 重要数学函数
一元:
# 求数组各元素的绝对值
np.abs(x)
# 求数组各元素的绝对值
np.fabs(x)
# 求数组各元素的平方根
np.sqrt(x)
# 求数组各元素的平方
np.square(x)
# 求数组各元素的自然对数
np.log(x)
# 求数组各元素的 2 底对数
np.log2(x)
# 求数组各元素的 10 底对数
np.log10(x)
# 求数组各元素的 ceiling 值
np.ceil(x)
# 求数组各元素的 floor 值
np.floor(x)
# 求数组各元素的四舍五入值
np.rint(x)
# 将数组各元素的整数和小数部分以两个独立数组形式返回
np.modf(x)
# 求数组各元素的 cos 值
np.cos(x)
# 求数组各元素的 sin 值
np.sin(x)
# 求数组各元素的 tan 值
np.tan(x)
# 求数组各元素的 e^n 值
np.exp(x)
# 求数组各元素的符号值,1(+),0,-1(-)
np.sign(x)
# 返回 a 中元素的梯度
np.gradient(a)
二元:
# 两个数组各元素进行比较,取大的那个,返回数组
# a,b 也可以是数字类型
np.maximum(a, b)
# 两个数组各元素进行比较,取小的那个,返回数组
# a,b 也可以是数字类型
np.minimum(a, b)
# 将 b 中各元素的符号赋值给 a 中各元素
np.copysign(a, b)
Numpy 重要随机函数
# 假设 a 为 2 维数组,将数组 a 的行重新随机排序,原地操作
np.random.shuffle(a)
# # 假设 a 为 2 维数组,将数组 a 的列重新随机排序,原地操作
np.random.shuffle(a.T)
# 根据数数字大小产生一个随机排列的一维数组,可做其他数组的随机索引
np.random.permutation(数字)
# 从数组 a 以概率 p 取元素,形成 size 大小的新数组,replace 表示是否可以重用元素,默认 False
np.random.choice(a[, size, replace, p])
Numpy 逻辑操作
# 逻辑与
np.logical_and(a)
# 逻辑或
np.logical_or(a)
# 逻辑异或
np.logical_xor(a)
# 逻辑非
np.logical_not(a)
Numpy 其他重要函数
# 当 condtiion 为真时返回 true_value,否则返回 false_value,返回一个新数组
np.where(condition, true_value, false_value)
数组元素类型的变换:
# 改变数组元素的类型,非原地
a.astype(np.int32)
数组转列表:
# 转成列表后就无法发挥 numpy 的性能优势了,非原地
a.tolist()
数组拷贝:
# 返回一个新数组,与 a 共用数据
a.view()
# 返回数组的深拷贝
a.copy()
把字节流转换为数组:
np.frombuffer(f.read(), dtype=np.int8, offset=8) # offset 可以跳过头部几个字节
Numpy 与线性代数
# 矩阵乘法,等同 `A @ b`
np.dot(A, b)
# 计算行列式
np.linalg.det(A)
# 计算矩阵的特征值和特征向量
np.linalg.eig(A)
# 计算矩阵的逆
np.linalg.inv(A)
# 计算矩阵的 Moore-Penrose 伪逆
np.linalg.pinv(A)
# 计算 qr 分解
np.linalg.qr(A)
# 计算奇异值分解
np.linalg.svd(A)
# 解线性方程组 AX=b
np.linalg.solve(A, b)
# 计算 AX=b 的最小二乘解
np.linalg.lstsq(A, b)
数据存取相关
CSV 存取,只能存储一维和二维数据:
# 写入数据
np.savetxt('a.csv', a, fmt='%.1f', delimiter=',')
# 读取数据,默认 float
np.loadtxt('a.csv', dtype=np.float, delimiter=',')
另一种存储方式,能存储多维数据:
# 这种存储方式会丢失维度信息
b.tofile('b.dat', sep=',', format='%d')
# 需用 reshape 还原
np.fromfile('b.dat', dtype=np.int, sep=',').reshape(5, 10, 2)
# 不指定 sep 会生成二进制文件
b.tofile('b.dat', format='%d')
# 需用 reshape 还原
np.fromfile('b.dat', dtype=np.int).reshape(5, 10, 2)
Numpy 便捷文件存取,会保存维度,元素类型信息:
# 正常存储,默认 .npy 格式
np.save('b', b)
# 压缩存储,默认 .npz 格式
np.savez('b', b)
# 读取
np.load('b.npy')