风险控制

欺诈风险

  • 欺诈:以故意欺瞒事实而诱使对方发生错误认识的故意行为,通常目的是使欺诈者获利
    • 欺诈的行为要素
      • 使人发生错误认识为目的
      • 故意行为
    • 欺诈可以分为
      • 冒用:冒用他人身份,通过生物信息技术等容易发现
      • 伪装:伪造部分信息,相对而言更难识别
    • 金融领域“资金就是生产资料”使得欺诈者的非法获利更容易

欺诈事件

  • 白户:账户信息缺失,没有足够数据对借款人进行风险评估
    • 内部白户:新注册、无申贷历史记录
    • 外部白户:人行征信、三方征信无覆盖
  • 黑户:账户存在逾期、失信、欺诈记录
    • 内部黑户:历史订单逾期
    • 外部黑户:人行征信、三方征信黑
    • 论坛、公开渠道监控
  • 恶意欺诈:账户通过伪造资料、蓄意骗贷
    • 伪造账单流水记录骗取更高额度
    • 恶意欺诈账户可能涉及不良嗜好,如黄赌毒等
  • 身份冒用:伪冒他人身份进行欺诈骗贷
    • 熟人冒用
    • 他人盗用
    • 一般可通过信审、人脸识别、活体验证核验借款人身份
  • 以贷养贷
    • 放大共贷风险杠杆
    • 可通过三方征信机构的多头借贷产品识别
  • 中介欺诈:黑中介哄骗或招揽客户实施骗贷
    • 黑中介利用风控漏洞大规模攻击,造成大量资损
  • 传销:有组织的开展收费并发展多级下线,存在集中骗贷风险
    • 存在老客拉新,从关系网络上具有明显星状结构

欺诈者身份

  • 第一方欺诈:欺诈者用真实身份进行欺诈

    • 严格来说不是欺诈,没有在身份信息上误导平台
    • 应对措施
      • 黑名单
  • 第二方欺诈:企业、渠道内员工进行内部欺诈、内外勾结

    • 即巴塞尔协议操作风险中的内部欺诈
    • 应对措施
      • 内控:权限获取合理、流程上风险分散、操做可追溯
  • 第三方欺诈:非欺诈者自身、企业内部的第三方欺诈

    • 名义借贷者身份信息通过黑色产业链购买、养号,作为黑产军团的一个链条
    • 申请欺诈
      • 账户盗用
      • 资料造假
      • 恶意违约
    • 交易欺诈
      • 账户冒险
      • 养卡
      • 套现
    • 应对措施
      • 对抗性强、低侵入、性价比各种能力和技术
      • 社交网络发现
      • 数据交叉对比
      • 模型客户用户画像

获取非法收益的时间

  • First Payment Default 首轮欺诈

    • 首期失联
  • Bust-out 余额欺诈

    • 短时间将授信刷高再获利离场

收益来源环节

  • 单个客户利润 = 贷款收益 - 资金成本 - 信用成本 - 获客成本
    • 获客成本 - 税收成本
  • 骗贷:信用成本中的风险成本
  • 羊毛:获客成本中的补贴
  • 刷量:获客成本中的广告费
  • 虚假短信:运营费用中的短信流量费

得利方、损失方

  • C骗C:在互金领域不多
    • 即使是P2P,也会有平台兜底
  • B骗C
  • C骗B
  • B骗B

反欺诈

  • 防范欺诈的重要障碍是欺诈难以标注,是通过贷后表现推断贷前 意图

    • 一般只有真正联系到本人或失联,很难有足够证据证明是欺诈导致的逾期,而不是信用导致逾期
    • 欺诈导致逾期往往有以下特征
      • 首逾:最常作为欺诈指标
        • 对第一方、第三方欺诈,往往会发生首逾
        • 对第二方欺诈,考虑到内部人员的考核、规避等 原因,有可能会正常还款1到2期,此类欺诈较难认定
      • 催收追回率更高
  • 反欺诈调研步骤

    • 风险事件发现:具有敏锐的风险嗅觉,发现可疑事件
    • 欺诈场景还原:广泛收集各渠道信息还原欺诈场景,调研分析背后可能原因
    • 风险规则提炼:从欺诈场景中提炼相应专家规则,拦截欺诈
    • 技术算法支持:搜集相应数据,根据数据类型和场景特点寻找合适算法识别欺诈
  • 反欺诈除了常规的策略部署外,还需要考虑人性:延迟模型和规则的效用

    • 抓大放小:允许小资损,随机抽取小比例的欺诈者通过
      • 隐藏防控点,用于积累黑名单
      • 迷惑欺诈团伙
    • 虚假额度:设置虚假授信额度,但借口其他理由不放款

调研欺诈风险渠道

  • 实时大盘监控:适合识别黑中介风险、传销风险等团伙欺诈
    • 设备聚集性风险 LBSWIFI
    • 地域欺诈风险,如朋克村
  • 信审催收反馈
    • 通过电话外呼、核验用户身份、咨询借款动机,根据用户反应发现身份伪冒
  • 论坛舆情监控
    • 对相关论坛、讨论组等检测仪监控,发现市场动向
    • 理解欺诈人群的心理特征、社会身份
  • 黑产卧底调研
    • 线上加入相关社区,站在欺诈账户立场上,找寻风控系统弱点
    • 线下去欺诈案件多发地,实地调研、学习黑产手法

反欺诈专家规则

  • 针对网贷黑中介识别的风险规则

    • 中介通讯录长常常会存储客户号码,并加以备注
    • 因为需要联系客户,运营商数据中往往会留下痕迹
    • 中介网贷申请手法更熟练,在申请页面停留时间短
    • 使用网络可能包含“网贷”等敏感信息
    • 人脸活体验证时存在照片翻拍、视频通话
  • 对反欺诈规则同样可按照一般规则进行评价

    • 规则欺诈命中次数、命中率
      • 规则欺诈命中次数 = 命中触发报警之后被认定为欺诈次数
      • 欺诈命中率 = 规则欺诈命中次数 / 规则报警次数
    • 综合欺诈命中次数
      • 综合欺诈次数 = 规则欺诈命中次数 + 逾期调查认定欺诈数
      • 综合欺诈命中率
    • 考虑到欺诈逾期特征,可以把首逾、催收回账户重点调查
  • 专家规则有高准确率的优点,但是覆盖的人群有限,性价比低,过多会导致规则集冗长,不利于维护

反欺诈算法

  • 应用方向

    • 辅助调查人员从单个案件的调查上升到对团体的调查,提高人工审核效率
    • 通过用户之间的关联关系,给调查人员提供更多分析线索
  • 算法研究方向

    • 基于社交网络的模型
      • 基于通讯录、运营商数据,采用基于图的社区发现算法
    • 基于无监督聚类的模型
    • 知识图谱
    • Embedding 特征构建
      • 基于埋点行为数据,生成 Embedding 特征
    • 文本分类
      • 基于论坛文本、通讯录名称、WIFI 名称分类

First Payment Deliquency模型

  • FPD 模型:以首逾作为目标变量建立模型

    • 假设:欺诈者动机是骗钱,那么第一期就会逾期
    • 入模变量一般是负面特征
      • 安装负面 App 数量
      • 历史逾期次数
  • 基于欺诈的还款表现作为理论支撑,但是也存在一定缺陷

    • 逾期标签存在滞后性,首逾标签存在至少一个月,不利于快速响应
    • 放贷样本同总体有偏,在其上训练模型存在偏差,会低估风险

信用风险

架构相关算法

无符号整形二进制

1数量

  • 目标:统计 unsinged 二进制表示中 1 数量
  • 思路方向
    • 移位遍历
    • 分治统计

仅遍历1

1
2
3
4
5
6
7
8
int population(unsigned int bits){
int result = 0;
while (bits != 0){
bits &= bits - 1;
++result;
}
return result;
}
  • 遍历减少:仅仅遍历无符号整形二进制表示中 1 次数
    • bits &= bits - 1 将末尾 1 消除

分治+查表

1
2
3
4
5
6
7
8
9
10
11
12
13
int * initialization(){
int * table = new int[256];
for (int i = 1; i < 256; i++){
table[i] = (i & 0x1) + table[i >> 1];
}
return table;
}
int population(int bits, int * table){
return table[bits & 0xff] +
table[(bit >> 8) & 0xff] +
table[(bit >> 16) & 0xff] +
table[(bit >> 24) & 0xff]
}
  • 思路
    • 建表:为 8bits 数建立 256 长度的 1 数量表
      • 递推建立:f(n) = f(n >> 1) + last_bit(n)
    • 分治:将无符号整型分4块查表、加和结果

分治

1
2
3
4
5
6
7
8
9
int population(unsigned int bits){
// 分组计算
bits = (bits & 0x55555555) + ((bits >> 1) & 0x55555555);
bits = (bits & 0x33333333) + ((bits >> 2) & 0x33333333);
bits = (bits & 0x0f0f0f0f) + ((bits >> 4) & 0x0f0f0f0f);
bits = (bits & 0x00ff00ff) + ((bits >> 8) & 0x00ff00ff);
bits = (bits & 0x0000ffff) + ((bits >> 16) & 0x0000ffff);
return bits;
}

unsigned_population__division

  • 分治统计:依次将相邻 2bits、 4bits 分组,计算组内 1数量
    • 移位、求并:将组内无效 bits 置 0、并对齐
    • +:计算组内 1 数量
      • 0x0 + 0x0 = 0x0
      • 0x0 + 0x1 = 0x1
      • 0x1 + 0x1 = 0x10:进位,符合逻辑
  • 改进方式:考虑避免不必要的 &
    • 根据进位特性替换 2bits 组对应语句
    • 考虑组内空位是否可容纳 + 后结果
      • 8bits 组:有效半组 4bits 足够存储中的最大 1 数量 8,但 无法存储 16 或更大, 需要及时置空无效bit
      • 16bits 组及之后:有效半组足够存储最大 1 数量 32,可以 计算完之后再取值
1
2
3
4
5
6
7
8
9
10
11
int population(unsigned int bits){
// 等于上述首行
bits = bits - ((bits >> 1) & 0x55555555);
bits = (bits & 0x33333333) + ((bits >> 2) & 0x33333333);
// 4bits 足够存储组内 8bits 中 `1` 最大数量 8
bits = (bits + (bits >> 4)) & 0x0f0f0f0f;
// 8bits 足够存储全部 32bits 中 `1` 最大数量 32
bits = bits + (bits >> 8);
bits = bits + (bits >> 16);
return bits & 0x3f
}

奇偶性

  • 目标:判断 unsigned 二进制表示中 1 数量奇偶性
  • 思路方向
    • 移位遍历,注意语言特性
      • 逻辑移位和算术移位
      • 求余结果
    • 分治统计

分治统计

1
2
3
4
5
6
7
8
9
10
11
12
// 原始版本
unsigned char parity(unsigned int i){
// 相邻2bit一组异或确定奇偶
i = i ^ (i >> 1);
// 相邻4bit一组,依赖以上结果确定奇偶
i = i ^ (i >> 2);
i = i ^ (i >> 4);
i = i ^ (i >> 8);
i = i ^ (i >> 16);
// 奇偶性保存在最后1bit,取出
return i & 0x1;
}
  • 分治统计:依次将相邻 2bits、 4bits 分组,统计组内奇偶性
    • 分组方式顺序调换仅影响中间结果中存放奇偶性统计结果 bits 位置
      • 奇偶性统计结果存放在组内最后 bit
      • 其中每次分组统计事实上都是统计 2bits 的奇偶性
  • 改进方式
    • 调整分组顺序,将存储奇偶性 bits 位置移至最后
    • 计算奇偶性 bits 对应奇偶性表,查表得到结果
      • 一般可以设置长度为 0x0f 长度的数组,其中取值为索引奇偶性
      • 0x6996 即为对应奇偶性表,其中各位序 bit 取值为位序值对应 的奇偶性
1
2
3
4
5
6
7
8
9
// 改进版本
unsigned char parity_k(unsigned int i){
// 将存储奇偶性 bits 移至最后
i = i ^ (i >> 4);
i = i ^ (i >> 8);
i = i ^ (i >> 16);
// 查表得到结果
return (0x6996 >> (i & 0x0f )) & 0x01;
}

奇偶性填充

  • 目标:将 unsigned char 中最高位作为校验位,保证整体的二进制标表示的奇偶性
  • 思路方向
    • 1数量并设置标志位
    • 按位乘积后取模

取模

1
2
3
4
5
6
unsigned char even(unsigned char i){
return ((i * 0x10204081) & 0x888888ff) % 1920;
}
unsigned char odd(unsigned char i){
return ((i * 0x00204081) | 0x3DB6DB00) % 1152;
}
  • 各数字二进制含义(设 i 的二进制表示为 abcdefg
    • 0x10204081 * i 得到 i 二进制重复 5 次(溢出被截断)
    • 0x888888ff & 抽取所需 bits d000a000e000b000f000c000gabcdefg
    • 1920 = 15 * 128:对其取模即得到[X]abcdefg (将被除数表示为 16 进制分块可证)

位元反序

  • 目标:返回 6bits 长二进制的反序
1
2
3
unsigned char revert(unsigned char i){
return ((i * 0x00082082) & 0x01122408) % 255;
}
  • 各数字二进制含义(设 i 的二进制表示为 abcdef
    • 0x00082082 * i 得到 i 二进制重复 4 次
    • 0x01122408 & 抽取所需 bits 0000000a000e00b000f00c000000d000
    • 255 取模即得到反序*(将被除数表示为 256 进制分块可证)

前导 0

  • 目标:获取 unsigned 的二进制表示中前导 0 数量
  • 思路方向
    • 移位遍历
    • 区间映射:将原始 unsigned 映射为较小范围的取值

区间映射

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
unsigned char nlz(unsigned int i){
static unsigned char table[64] = {
32, 31, 'u', 16, 'u', 30, 3, 'u', 15, 'u', 'u', 'u', 29,
10, 2, 'u', 'u', 'u', 12, 14, 21, 'u', 19, 'u', 'u', 28,
'u', 25, 'u', 9, 1, 'u', 17, 'u', 4, 'u', 'u', 'u', 11,
'u', 13, 22, 20, 'u', 26, 'u', 'u', 18, 5, 'u', 'u', 23,
'u', 27, 'u', 6, 'u', 24, 7, 'u', 8, 'u', 0, 'u'
}

i = i | (i >> 1);
i = i | (i >> 2);
i = i | (i >> 4);
i = i | (i >> 8);
i = i | (i >> 16);
i = i * 0x06eb14f9;
return table[i >> 26];
}
  • 区间映射
    • 移位取或:将最高位 1 传播至所有低位,原始值映射至 33 种取值
    • 0x06eb14f9:将 33 种值映射为低 6 位取值均不同值
      • 此类数的共同特点是因子均为 $2^k \pm 1$ (此类数乘法容易通过移位操作实现)
      • 最小的此性质的数为 0x45bced1 = 17 * 65 * 129 * 513

速算

无符号整形除法

  • 目标:大部分计算机架构中除法耗时,寻找方法将特定除数的除法转换为 其他指令
  • 思路:除数为常数时,用移位、乘法、加法替代除法运算
    • 常数除法(有符号或无符号)基本都有对应的乘法版本
    • 注意类型溢出

除数为3

1
2
3
4
5
unsigned div3(unsigned int i){
// 在更高级别优化过程实际就会转化为类似指令
// 但此语句可能会导致类型溢出
return (i * 2863311531) >> 33;
}

快速求平方根倒数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
float i_sqrt(float a){
union {
int ii;
float i;
};
i = a;
float ihalf = 0.5f * i;

// 得到较好的初始估算值
ii = 0x5f000000 - (ii >> 1);

// 牛顿法迭代,可以重复以下语句多次提高精度
i = i * (1.5f - ihalf * i * i);

return i;
}
  • 移位获取初始值

    • 考虑(规格化)单精度浮点数 $a$ 的二进制表示

    • 0x5f000000 - (ii >> 1) 可以满足指数部分得到近似结果 $190 - \frac E 2$

    • 其他细节使得存在比 0x5f000000 实践更优值,如:0x5f375a86
      • 规格化值的底数接近 1
      • 移位运算指数最后位部分移至尾数
      • 减法运算尾数部分向指数借位
  • 牛顿法:$x{n+1} = xn - \frac {f(x_n)} {f^{‘}(x__n)}$

    • 求 $\frac 1 {\sqrt x}$,即求 $f(x) = x^{-2} - a$ 零点
    • 则迭代为 $x{n+1} = xn(1.5 - 0.5 a x__n^2)$

NDArray 科学计算

NumPy Numeric

矩阵、向量乘积

Function Desc
dot(a,b[,out]) a最后轴与b倒数第二轴的点积,即shape满足线代要求
inner(a,b[,out]) a最后轴与b最后轴的点积
vdot(a,b) 向量点积,多维将被展平
outer(a,b[,out]) 向量外积,多维将被展平
matmul(x1,x2,/[,out,casting,order,...]) 矩阵乘积
tensordot(a,b[,axes]) 沿指定轴计算张量积
einsum(subscripts,*operands[,out,dtype,...]) Einstein求和约定
einsum_path(subscripts,*operands[,optimize]) 考虑中间数组情况下评估计算表达式最小代价
linalg.matrix_power(a,n) 方阵幂
kron(a,b) Kronecker积(矩阵外积,分块)
trace(a[,offset,axis1,axis2,dtype,out])
  • Einstein求和约定:简化求和式中的求和符号

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    a = np.arange(0,15).reshape(3,5)
    b = np.arange(1,16).reshape(3,5)
    # Transpose
    np.einsum("ij->ji", a)
    # Sum all
    np.einsum("ij->", a)
    # Sum along given axis
    np.einsum("ij->i", a)
    np.einsum("ij->j", a)
    # Multiply
    np.einsum("ij,ij->",a,b)
    # Inner product
    np.einsum("ik,jk->",a,b)
  • np.tensordot:张量积,类似普通内积,仅有结构

    • axes为整形
      • axes>0a末尾axes维度、b开头axes维度 内积
      • axes=0:Kronecker积
    • axes为2-Tuple:分别指定ab内积的轴

其他

|Function|Desc| |np.i0(X)|第1类修改的Bessel函数,0阶|

np.linalg

  • NumPy的线代基于BLASLAPACK提供高效的标准底层实现
    • 依赖库可以是NumPy提供的C版本子集
    • 也可是针对特定平台优化的库(更好)
      • OpenBLAS
      • MKL
      • ATLAS

np.linalg

Function Desc
multi_dot(arrays) 自动选择最快的计算顺序计算内积
cholesky(a) cholesky分解
det(a) 行列式
eig(a) 特征值、特征向量(右乘)
eigh(a[,UPLO]) Hermitian(共轭对称)或实对称矩阵特征值、特征向量
eigvals(a) 特征值
eigvalsh(a[,UPLO]) Hermitian(共轭对称)或实对称矩阵特征值
inv(a) 矩阵逆
lstsq(a,b[,rcond]) 最小二乘解
norm(x[,ord,axis,keepdims]) 矩阵、向量范数
pinv(a[,rcond,hermitian]) Moore-Penrose伪逆
solve(a,b) 线程方程组求解
tensorsolve(a,b[,axes]) 张量方程组求解
tensorrinv(a[,ind]) 张量逆
svd(a[,full_matrices,compute_uv,hermitian]) 奇异值分解
qr(a[,mode]) QR分解
matrix_rank(M[,tol,hermitian]) 使用SVD方法计算矩阵秩
slogdet(a) 行列式的符号、自然对数
  • 部分线代函数支持传入高维数组、数组序列,同时计算结果
    • 对高维数组,要求数组最后2、1维度满足计算要求

(快速)傅里叶变换np.fft

Standard FFTs

Function Desc
fft(a[,n,axis,norm]) 1维离散傅里叶变换
fft2(a[,n,axes,norm]) 2维离散FFT
fftn(a[,n,axes,norm]) N维离散FFT
ifft(a[,n,axis,norm]) 1维离散逆FFT
ifft2(a[,n,axes,norm]) 2维离散逆FFT
ifftn(a[,n,axes,norm]) N维离散逆FFT

Real FFTs

Function Desc
rfft(a[,n,axis,norm]) 1维离散傅里叶变换
rfft2(a[,n,axes,norm]) 2维离散FFT
rfftn(a[,n,axes,norm]) N维离散FFT
irfft(a[,n,axis,norm]) 1维逆离散FFT
irfft2(a[,n,axes,norm]) 2维离散逆FFT
irfftn(a[,n,axes,norm]) N维离散逆FFT

Hermitian FFTs

Function Desc
hfft(a[,n,axis,norm]) Hermitian对称(实谱)的信号的FFT
ihfft(a[,n,axis,norm]) Hermitian对称(实谱)的信号的逆FFT

其他

Function Desc
fftfreq(n[,d]) 离散FFT样本频率
rfftfreq(n[,d])
fftshift(x[,axes]) 平移0频成分到频谱中间
ifftshift(x[,axes])

np.lib.scimath

  • np.lib.scimath中包含一些顶层命名空间的同名函数

    • 相较于顶层空间,其定义域被扩展,相应其值域也扩展到 复数域

      1
      np.emath.log(-np.e) == 1 + np.pi * 1j
  • np.emathnp.lib.scimath模块的推荐别名

NDArray Routine

Array Manipulation

Shape Only

Routine Function Version Method Version
reshape(a,newshape[,order])
resize(a,new_shape) 大小可不同,重复a补不足 0补不足
ravel(a[,order]) 展平视图
.flatten([order]) 展平副本
shape(a)
size(a)

Order Alteration

Routine Function Version Method Version
transpose(a[,axes]) 调整轴顺序,缺省逆序即转置
moveaxis(a,source,destination) 移动数组轴到新位置
rollaxis(a,axis[,start]) 将指定后向插入至指定位置(缺省0)
swapaxes(a,axis1,axis2) 交换轴
flip(m[,axis]) 沿指定轴反向,缺省所有轴
fliplr(m) 左右反向(沿第2轴)
flipud(m) 上下反向(沿第1轴)
roll(a,shift[,axis]) 沿轴滚动shift
rot90(m[,k,axes]) axes指定的平面中旋转k次90度
lib.stride_tricks.as_strided(x[,shape,...]) 利用给定shape、stride在x上创建视图

维数改变

Routine Function Version Method Version
atleast_1d(*arys) prepend维度直至维度至少维数至少1
atleast_2d(*arys)
atleatt_3d(*arys)
broadcast(*arys) 广播、打包输入对应元素的元组迭代器,类似zip
broadcast_to(array,shape[,subok]) 广播为指定shape
boradcast_arrays(*args,**kwargs) 输入的广播结果列表
expand_dims(a,axis) 在指定位置插入新轴
squeeze(a[,axis]) 删除大小为1维度

插入、删除元素

Routine Function Version
delete(arr,obj[,axis]) 删除obj指定部分,缺省按展平数组删除
insert(arr,obj,values[,axis]) 缺省按展平数组插入
append(arr,values[,axis]) 缺省arrvalues展平再添加
trim_zeros(filt[,trim]) trim前导、尾随0,缺省两边

改变类型

Routine Function Version Method Version
asarray(a[,dtype,order]) 转换为数组
asarray_chkfinite(a[,dtype,order]) 检查NaNinf
asanyarray(a[,dtype,order]) 转换为数组,数组子类则不变
ascalar(a) 将大小为1的数组转换为等效标量
require(a[,dtype,requirements]) 创建满足要求ndarray.flags数组
asfortranarray(a[,dtype]) 转换为Fortran-contiguous风格内存布局
ascontiguousarray(a[,dtype]) 转换为C-contiguous风格内存布局
asmatrix(data[,dtype])
asfarray(a[,dtype]) 转换为浮点类型
.astype(dtype[,order,casting,...]) 转换为指定类型
  • numpy中数组不是仅有C、Fortran风格内存布局,对数组的形态 变换会导致内存布局不为任何风格内存布局

组合数组

Routine Function Version
concatenate((a1,a2,...)[,axis,out]) 沿现有轴连接数组
stack(arrays[,axis,out]) 创建给定(新)轴堆叠数组
row_stack(tup)/vstack(tup) 沿第1(竖直)轴堆叠
column_stack(tup)/hstack(tup) 沿第2(水平)轴堆叠
dstack(tup) 沿第3轴堆叠
block(arrays) 按照arrays中给定数组块、位置组装

拆分数组

Routine Function Version
split(ary,indices_or_sections[,axis]) 沿轴拆分成视图
array_split(ary,indices_or_sections[,axis]) split,但可处理不整除拆分
vsplit(ary,indices_or_sections) 沿第1(竖直)轴拆分
hsplit(ary,indices_or_sections) 沿第2(水平)轴拆分
dsplit(ary,indices_or_sections) 沿第3轴拆分

Padding

Function Desc
pad(array,pad_width[,mode])

Index Routine

  • 结果数组shape考虑逻辑链

    • 确定输出数组的维数ndim
    • 确定参数数组原维度轴位置、补1轴位置,参数维度轴对齐
    • 修正各维度大小
      • 沿轴操作:保持不变
      • 沿轴采样:采样数目
      • 沿轴concate:维度相加
      • 沿轴聚集:删除维度
      • 沿轴切片聚集:删除其余维度
  • numpy中(多维)索引往往使用整数高级索引的方式返回

    • np.ndarray数组:首维度各分量分别表示各维度的高级 索引
    • list、tuple:各元素分别为各维度的高级索引

数组无关切片、高级索引

Routine Function Version 返回值类型
s_[] 支持多维切片生成,类slice() 切片、元组
index_exp[] s_,但总返回元组 元组
r_[] 沿第1轴concate切片、数组、标量 数组
c_[] 沿第-1轴concate切片、数组、标量(1维则被视为列向量) 数组
ravel_multi_index(multi_index,dims[,mode,order]) 计算高级索引multi_indexdims数组展平后的位置 数组
unravel_index(indices,shape[,order]) ravel_multi_index逆向 元组
  • np.r_[]np.c_[]除可concate切片方便生成数组,还可以 传递两个参数修改行为

    • r/c字符被设置时,返回矩阵

      • 1维数组,r被设置时返回1 N矩阵,c被设置时 返回N 1矩阵
      • 2维数组,rc被设置时,结果矩阵相同
    • <axis>[,<ndim>,<ori_pos>]三个整形,决定shape

      |参数|说明|np.r_[]缺省值|np.c_[]缺省值| |——-|——-|——-|——-| |<axis>|concate执行轴|0|-1| |<ndim>|目标维数,仅在其大于结果维数时才生效|1|2| |<ori_pos>|原数据轴所在的位置|-1,即prepend全1轴|0,即postpend全1轴|

    • 相同参数时,两者结果相同,可根据不同数组设置合适的 参数相互实现

      • np.r_[]可视为参数缺省为0,1,-1
      • np.c_[]可视为参数缺省为-1,2,0
  • np.r_np.c_分别是np.lib.index_tricks.RClassnp.lib.index_tricks.CClass实例
  • np.s_np.index_exp均是 np.lib.index_tricks.IndexExpression实例,仅初始化参数 不同

网格

Routine Function Version 返回值类型
ix_(*args) args为基点创建开网格(仅设置基点、维度) 元组
meshgrid(*xi,**kwargs) xi作为基点创建稠密网格(所有网格点高级索引) 列表
mgrid[] 根据切片创建稠密网格 数组
ogrid[] 根据切片创建开网格 列表
indices(dimensions[,dtype,sparse]) dimensions作为各维度长创建网格 数组、元组
  • 开网格广播即可得到稠密网格

值相关索引

Routine Function Version Method Version
nonzero(a) 非0元素整形高级索引
where(condition,[x,y]) condition对应整形高级索引,给出x,y时则从中抽取元素
flatnonzero(a) 展平非0位置

特殊位置索引

Routine Function Version
diag_indices(n[,ndim]) ndim维长为n数组对角索引
diag_indices_from(arr) 获取arr对角索引
mask_indices(n,mask_func[,k]) 根据mask_func获取n * n数组索引
tril_indices(n[,k,m]) n * m的下三角索引
triu_indices(n[,k,m]) n * m的上三角索引
tril_indices_from(arr[,k]) arr的下三角索引
triu_indices_from(arr[,k]) arr的下三角索引
  • np.ndindex(*args) == np.broadcast(*np.indices(*args))

Searching 索引

Routine Function Version Method Version
argwhere(a) 非0点坐标数组
argmax(a[,axis,out]) 展平后位置,存在NaN则返回0
argmin(a[,axis])
nanargmax(a[,axis]) 忽略NaN
nanargmin(a[,axis])
searchsorted(a,v[,side,sorter]) 应插入(保持有序)位置

Value Manipulation

Value Extraction

Routine Function Version Method Version
take(a,indices[,axis,out,mode]) indices沿给定轴获取超平面(缺省将数组展平)
take_along_axis(arr,indices,axis) arrindices沿axis匹配,选取元素
compress(condition,a[,axis,out]) 按bool数组condition沿给定轴axis选取超平面(缺省将数组展平)
extract(condition,arr) 在展平数组上抽取元素
choose(a,choices[,out,mode]) 根据a广播后元素值选择choices中数组填充对应位置
select(condlist,choicelist[,default]) condlist中首个真值对应的choicelist数组填充对应位置
diag(v[,k]) 从2维v抽取对角、或以1维v作为对角
diagonal(a[,offset,axis1,axis2]) 返回给定对象
  • take:沿给定轴从数组中获取元素

    • axisNone时,按展平后获取indices指定元素, 非None
      • 函数行为同高级索引
      • 指定axis可以简化通过高级索引获取指定轴的元素
    • 基本元素为数组在该轴的切片
    1
    2
    3
    4
    5
    6
    Ni, Nk = a.shape[:axis], a.shape[axis+1:]
    Nj = indices.shape
    for ii in np.ndindex(Ni):
    for jj in np.ndindex(Nj):
    for kk in np.ndindex(Nk):
    out[ii+jj+kk] = a[ii+(indices[jj],)+kk]
  • take_along_axis:匹配给定轴方向的1维索引、数据切片, 获取元素

    • 基本元素为单个元素
      • indicesarr对齐,除给定维度外,其余维度 大小均须相同
      • 其余维度给定下,按照indices在超平面上给出的 位置获取对应的元素
      • take以超平面为单位获取整个超平面的元素,而 take_along_axis按元素为单位,沿给定轴方向调整 元素顺序
    • np.argsortnp.argpartition等函数能够返回适合此 函数的索引
    1
    2
    3
    4
    5
    6
    7
    8
    9
    N1, M, Nk = arr.shape[:axis], arr.shape[axis], arr.shape[axis+1:]
    J = indices.shape[axis]
    out = np.empty(Ni + (J,) + Nk)
    for ii in np.ndindex(Ni):
    for kk in np.ndindex(Nk):
    a_1d = arr[ii + np.s_[:,] + kk]
    indices_1d = indices[ii + np.s_[:,] +kk]
    out_1d = out[ii + np.s_[:,] + kk]
    out_1d = a_1d[indices_1d[j]]
  • np.choose

    • choices:数组序列,其中数组和a需广播兼容
      • 若本身为数组,则其最外层被视为序列
    • 逻辑
      • achoices中数组共同广播
      • 广播结果的shape即为结果shape,其中a取值为n 处用数组choices[n]填充
    1
    np.choose(a,choices) == np.array([choices[a[I]][I] for I in np.ndindex(a.shape)])
  • np.select

    • 使用各位置condlist首个真值出现的位序值构建a,则 等价于np.choose(a,choicelist) (不考虑缺省值)
  • np.extract

    • 等价于np.compress(np.ravel(condition), np.ravel(arr))
    • condition为bool数组,也等价于arr[condition]

Value Modification

Routine Function Version Method Version
place(arr,mask,vals) 按照mask循环使用vals中值替换arr中元素
put(a,ind,v[,mode]) place,但根据展平索引ind替换
put_along_axis(arr,indices,values,axis) 匹配indicesarr沿axis分量,替换值
copyto(dst,src[,casting,where]) 根据bool数组where替换dst中元素
putmask(a,mask,values) copyto
fill_diagonal(a,val[,wrap]) val填充a的主对角
clip(a,a_min,a_max[,out=None,**kwargs]) 裁剪值
  • wheremaskcondition缺省为、等价为bool数组
  • np.clipufunc

Sorting

Routine Function Version Method Version
sort(a[,axis,kind,order,]) 在位排序
lexsort(keys[,axis]) 根据keys中多组键沿axis轴排序(靠后优先级高)
msort(a) 沿第1轴排序
argsort(a[,axis,kind,order]) 沿axis方向间接排序
sort_complex(a) 先实、后虚排序
partition(a,kth[,axis,kind,order]) 以第kth大小数划分
argpartition(a,kth[,axis,kind,order]) 间接分段
  • lexsort:按照axis方向、以keys中数组顺序作为权重 进行间接排序
    • keys:数组序列或2维以上数组
      • 数组最高维视为序列
      • keys为数组时,最高维被省略
      • 多个数组视为权重不同的排序依据,靠后优先级高
    • axis:排序所沿轴方向,缺省为-1,沿最低维轴排序
      • 可视为按keys中数组逆序优先级,取用各数组沿轴 方向的间接排序结果
      • 即对每个第1轴、axis构成平面,优先考虑第1轴末尾 axis方向数组进行排序,再依次考虑前序
    • lexsortargsort排序方向相同时,lexsort结果中 最后子数组和argsort结果应差别不大 (排序方向相同而不是axis参数取值相同)

Logical Test

真值测试

Routine Function Version Method Version
all(a[,axis,out,keepdims]) 给定轴方向所有元素为真
any(a[,axis,out,keepdims]) 给定轴方向存在元素为真

数组内容

Routine Function Version
isfinite(x,/[,out,where,casting,order,...]) 逐元素是否有限
isinf(x,/[,out,where,casting,order,...])
isnan(x,/[,out,where,casting,order,...])
isnat(x,/[,out,where,casting,order,...]) 逐元素是否NaT
isneginf(x,/[,out])
isposinf(x,/[,out])
  • isneginfisposinf行为类似ufunc,但不是

类型测试

Routine Function Version
iscomplex(x)
iscomplexobj(x) 复数类型或复数值
isfortran(a) Fortran contiguous
isreal(x)
isrealobj(x) 实数类型或实数值
isscalar(x)

Mathmatics

  • 部分数学函数为ufunc

UFunc初等运算

Function Desc
add(x1,x2,/[out,where,casting,order,...])
subtract(x1,x2,/[,out,where,casting,...])
multiply(x1,x2,/[,out,where,casting,...])
divide(x1,x2,/[,out,where,casting,...])
true_devide(x1,x2,/[,out,where,casting,...])
floor_devide(x1,x2,/[,out,where,casting,...])
logaddexp(x1,x2,/[,out,where,casting,...]) ln(x1+x2)
logaddexp2(x1,x2,/[,out,where,casting,...]) log_2 (x1+x2)
negative(x,/[,out,where,casting,order,...])
positive(x,/[,out,where,casting,order,...])
power(x1,x2,/[,out,where,casting,order,...]) x1^x2
float_power(x1,x2,/[,out,where,casting,...]) x1^x2
remainder(x1,x2,/[,out,where,casting,...]) 求余/取模
mod(x1,x2,/[,out,where,casting,order,...]) 求余/取模
fmod(x1,x2,/[,out,where,casting,order,...]) 求余/取模
divmod(x1,x2,/[,out1,out2],/[out,...])
absolute(x,/[,out,where,casting,order,...])/abs
rint(x,/[,out,where,casting,order,...])
sign(x,/[,out,where,casting,order,...])
heaviside(x1,x2,/[,out,where,casting,...]) 阶跃函数
conj(x,/[,out,where,casting,...]) 对偶
exp(x,/[,out,where,casting,order,...])
exp2(x,/[,out,where,casting,order,...])
log(x,/[,out,where,casting,order,...])
log2(x,/[,out,where,casting,order,...])
log10(x,/[,out,where,casting,order,...])
expm1(x,/[,out,where,casting,order,...]) 计算exp(x)-1
log1p(x,/[,out,where,casting,order,...]) 计算ln(x+1)
sqrt(x,/[,out,where,casting,order,...]) 非负平方根
square(x,/[,out,where,casting,order,...])
cbrt(x,/[,out,where,casting,order,...]) 立方根
reciprocal(x,/[,out,where,casting,order,...]) 倒数
gcd(x,/[,out,where,casting,order,...]) 最大公约数
lcm(x,/[,out,where,casting,order,...]) 最小公倍数
  • out参数可用于节省内存,如:G=A*B+C
    • 等价于:t1=A*B; G=t1+C; del t1;
    • 可利用out节省中间过程内存:G=A*B; np.add(G,C,G)

UFunc Floating函数

Routine Function Version
fabs(x,/[,out,where,casting,order,...]) 不可用于复数
signbit(x,/[,out,where,casting,order,...]) signbit是否设置,即<0
copysign(x1,x2,/[,out,where,casting,order,...]) 根据x1设置x2signbit
nextafter(x1,x2,/[,out,where,casting,order,...]) x1朝向x2的下个浮点数,即变动最小精度
spacing(x,/[,out,where,casting,order,...]) x和最近浮点数距离,即取值的最小精度
modf(x[,out1,out2],/[,out,where],...) 返回取值的整数、小数部分
ldexp(x1,x2,/[,out,where,casting,...]) 计算x1*2**x2,即还原2为底的科学计数
frexp(x[,out1,out2],/[,out,where],...) 返回2为底的科学计数的假数、指数
floor(x,/,out,*,where,...)
ceil(x,/,out,*,where,...)
trunc(x,/,out,*,where,...)
rint(x,/[,out,where,casting,order,...]) 最近整数
around(a[,decimals,out])/round/round_
fix(x[,out]) 向零点取整
  • np.fix不是ufunc,但行为类似

比较函数

  • 数值比较

    • np.equal()更多应用于整形比较,比较浮点使用 np.isclose()更合适
    • np.allclose()则是判断数组整体是否相同
    • array_equal(a1,a2)数组a1a2相同
    • array_equiv(a1,a2)数组a1a2广播后相同
  • 逻辑运算符

    • &|~:逐元素逻辑运算
      • 优先级高于比较运算符
    • andornot:整个数组的逻辑运算
  • np.maximum()np.minimum()函数

    • max()寻找最大值效率比np.maximum.reduce()低,同样 min()效率也较低

UFunc比较函数

Routine Function Version Method Version
greater(x1,x2,/[,out,where,casting,...]) >
greater_equal(x1,x2,/[,out,where,casting,...]) >=
less(x1,x2,/[,out,where,casting,...]) <
less_equal(x1,x2,/[,out,where,casting,...]) <=
not_equal(x1,x2,/[,out,where,casting,...]) !=
equal(x1,x2,/[,out,where,casting,...]) ==
logical_and(x1,x2,/[,out,where,casting,...]) 逐元素and and
logical_or(x1,x2,/[,out,where,casting,...]) or
logical_xor(x1,x2,/[,out,where,casting,...])
logical_not(x1,x2,/[,out,where,casting,...]) not
maximum(x1,x2,/[,out,where,casting,...]) 逐元素选择较大者
minimum(x1,x2,/[,out,where,casting,...]) 逐元素选择较小者
fmax(x1,x2,/[,out,where,casting,...]) 逐元素选择较大者,忽略NaN
fmin(x1,x2,/[,out,where,casting,...]) 逐元素选择较小者,忽略NaN

非UFunc

Routine Function Version
isclose(a,b[,rtol,atol,equal_nan]) 逐元素容忍度范围内相等
allclose(a,b[,rtol,atol,equal_nan]) all(isclose())
array_equal(a1,a2[,equal_nan]) 数组整体
array_equiv(a1,a2) 广播后相等

UFunc Bit-twiddling函数

Routine Function Version
bitwise_and(x1,x2,/[,out,where,...])
bitwise_or(x1,x2,/[,out,where,...])
bitwise_xor(x1,x2,/[,out,where,...])
invert(x,/[,out,where,casting,...])
left_shift(x1,x2,/[,out,where,casting...])
left_shift(x1,x2,/[,out,where,casting...])

UFunc 三角函数

Routine Function Version
sin(x,/[,out,where,casting,order,...])
cos(x,/[,out,where,casting,order,...])
tan(x,/[,out,where,casting,order,...])
arcsin(x,/[,out,where,casting,order,...])
arccos(x,/[,out,where,casting,order,...])
arctan(x,/[,out,where,casting,order,...])
arctan2(x1,x2,/[,out,where,casting,order,...]) 考虑象限下,arctan(x1/x2)
hypot(x1,x2,/[,out,where,casting,order,...]) 计算斜边
sinh(x,/[,out,where,casting,order,...]) 双曲正弦
cosh(x,/[,out,where,casting,order,...])
tanh(x,/[,out,where,casting,order,...])
arcsinh(x,/[,out,where,casting,order,...])
arccosh(x,/[,out,where,casting,order,...])
arctanh(x,/[,out,where,casting,order,...])
deg2rad(x,/[,out,where,casting,order,...]) 角度转换为弧度
rad2deg/degrees(x,/[,out,where,casting,order,...]) 弧度转换为角度

基本数学

Routine Function Version Method Version
prod(a[,axis,dtype,out,keepdims,...])
nanprod(a[,axis,dtype,out,keepdims,...])
sum(a[,axis,dtype,out,keepdims,...])
nansum(a[,axis,dtype,out,keepdims,...])
cumprod(a[,axis,dtype,out,keepdims,...]) 累乘(也可用ufunc.accumulate
cumsum(a[,axis,dtype,out,keepdims,...]) 累加
nancumprod(a[,axis,dtype,out,keepdims,...]) NaN视为1
nancumsum(a[,axis,dtype,out,keepdims,...]) NaN视为0
diff(a[,n,axis,prepend,append,...]) 沿给定轴1阶差分(保持类型不变,注意溢出)
ediff1d(ary[,to_end,to_begin] 沿展平顺序1阶差分
gradient(f,*varargs,**kwargs) 梯度
cross(a,b[,axisa,axisb,axisc,axis]) 向量叉积
trapz(y[,x,dx,axis]) 梯形法则定积分

复数运算

Routine Function Version Method Version
angle(z[,deg]) 角度
real(val) 实部
imag(val) 虚部
conj/conjugate(x,/[,out,where,casting,order,...]) 复共轭

Miscellaneous

Routine Function Version
nan_to_num(x[,copy,nan,posinf,neginf]) 替换NaNinf为数值
real_if_close(a[,to]) 虚部接近0则省略
interp(x,xp,fp[,left,right,period]) 1维线性插值
polyfit(x,y,deg[,rcond,full,w,cov]) 最小二乘多项式拟合

Statistics

  • axis=None:默认值None,表示在整个数组上执行操作

Count

Routine Function Version
count_nonzero(a[,axis])

顺序

Routine Function Version Method Version
amin/min(a[,axis,out,keepdims,initial,where])
amax/max(a[,axis,out,keepdims,initial,where])
nanmin(a[,axis,out,keepdims,initial,where]) 忽略NaN
nanmax(a[,axis,out,keepdims,initial,where])
ptp(a[,axis,out,keepdims]) 极差
percentile(a,q[,axis,out,...]) q取值[0-100]
nanpercentile(a,q[,axis,out,...])
quantile(a,q[,axis,out,overwrite_input,...]) q取值[0,1]
nanquantile(a,q[,axis,out,...])

均值、方差

Routine Function Version Method Version
median(a[,axis,out,overwrite_input,keepdims])
average(a[,axis,weights,returned])
mean(a[,axis,dtype,out,keepdims])
std(a[,axis,dtype,out,ddof,keepdims]) 标准差
var(a[,axis,dtype,out,ddof,keepdims]) 方查
nanmedian(a[,axis,out,overwrite_input,...])
nanmean(a[,axis,dtype,out,keepdims])
nanstd(a[,axis,dtype,out,ddof,keepdims])
nanvar(a[,axis,dtype,out,ddof,keepdims])

相关系数

Routine Function Version
corrcoef(x[,y,rowvar,bias,ddof]) Pearson积差相关系数
correlate(a,v[,mode]) 卷积
convolve(a,v[,mode]) 离散、线性卷积
cov(m[,y,rowvar,bias,ddof,fweights,...]) 方差

Array Creation

Ones and Zeros

Routine Function Version
empty(shape[,dtype,order]) 无初始化
empty_like(prototype[,dtype,order,subok,...]) shape、类型同prototype
eye(N[,M,k,dtype,order]) 对角为1的2D数组
identity(n[,dtype]) 单位矩阵数组
ones(shape[,dtype,order])
ones_like(a[,dtype,order,subok,shape])
zeros(shape[,dtype,order])
zeros_like(a[,dtype,order,subok,shape])
full(shape,fill_value[,dtype,order]) full_value数组
full_like(a,fill_value[,dtype,order,...])

Numerical Ranges

Routine Function Version
arange([start,]stop[,step][,dtpye]) 给定间距
linspace(start,stop[,num,endpoint]) 给定数量,等差均分
geomspace(start,stop[,num,endpoint,base,...]) 等比均分
logspace(start,stop[,num,endpoint,base,...]) log10尺度上均分,同np.power(10, np.linspace(start,stop))

Repetition

Routine Function Version Method Version
tile(A,reps) 重复A(可是数组)创建一维数组
repeat(a,repeats[,axis]) 沿已有轴重复a创建

Matrix-Relative

Routine Function Version
diag(v[,k]) 从2维v抽取对角、或以1维v作为对角
diagflat(v[,k])
tri(N[,M,k,dtype]) 对角线及以下为1、其余为0矩阵
tril(m[,k]) 下三角
triu(m[,k]) 上三角
vander(x[,N,increasing]) Vandermonde矩阵

From Existing Data

Routine Function Version
array(object[,dtype,copy,order,subok,ndmin])
copy(a[,order])
frombuffer(buffer[,dtype,count,offset] 从缓冲(如字节串)创建数组
fromfunction(function,shape,**kwargs) 以坐标为参数,从函数创建数组
fromiter(iterable,dtype[,count])
  • 改变数组数据类型也可以视为是创建新数组

转入、转出

类型转出

Routine Method Version
.item(*args) 根据args选择元素复制至标准python标量
.tolist() 转换为.ndim层嵌套python标量列表
.itemset(*args) 插入元素(尝试转换类型)
.byteswap([inplace]) 反转字节序
.view([dtype,type]) 创建新视图
.getfield(dtype[,offset]) 设置数据类型为指定类型
.setflags([write,align,uic]) 设置标志
.fill(value) 使用标量填充

打包二进制

Function Desc
packbits(a[,axis,bitorder]) 元素打包为标志位,0补足,返回uint8数组
upackbits(a[,axis,bitorder])

输入、输出

Routine 格式 输入 输出
dump(file) pickle 文件
tofile(fid[,sep,format]) 内存内容(sep="")、分割符串 文件
fromfile(file[,dtype,count,sep,offset]) 字节串、分割符串 文件 数组
save(file,arr[,allow_pickle,fix_imports]) .npy 数组 文件
savez(file,*args,**kwds) 非压缩的.npz (多个)数组 文件
savez_compressed(file,*args,**kwds) 压缩的.npz (多个)数组
load(file[,mmap_mode,allow_pickle,...]) .npy.npz、pickle 文件 数组
savetxt(fname,X[,fmt,delimiter,newline,...]) 分割符串 二维以下数组 文件
loadtxt(fname[,dtype,comments,delimiter,...]) 分割符串 文件 数组
genfromtxt(fname[,dtype,comments,...]) 分割符串 文件 数组
fromregex(file,regexp,dtype[,encoding]) 正则表达式结构 文件 数组

Routine Function Version Method Version
array2string(a[,max_line_width,precision,...]) __str__
array_repr(arr[,max_line_width,precision,...]) __repr__
array_str(arr[,max_line_width,precision,...]) __str__
dumps() pickle序列化
loads(*args,**kwargs) pickle 字节串 数组
tobytes([order])/tostring 内存内容字节串
fromstring(string[,dtype,count,sep]) 从字符串、字节串(sep="",且缺省)创建1维数组
  • np.loadspickle.loads,不建议使用
  • np.fromstring
    • sep="":从二进制字节串中创建数组,类frombuffer
    • sep置为分割符时,只能指定一种元素分隔符,也只能 解析1维数组的字符串

字符串输出格式

Routine Function Version
format_float_positional(x[,precision,...]) 格式化位置计数
format_float_scientific(x[,precision,...]) 格式化科学计数
set_printoptions([precision,threshold,...])
get_printoptions()
set_string_function(f[,repr])
printoptions(*args,**kwargs) 设置打印选项的上下文管理器
binary_repr(num[,width]) 二进制字符串
base_repr(number[,base,padding])

Data Source

Function Desc
DataSource([destpath]) 通用数据源文件(file,http,ftp等)

Numpy 性能

Miscellaneous

性能调优

Function Desc
setbufsize(size) 设置ufunc使用的缓冲区大小
getbufsize()
shares_memory(a,b[,max_work])
may_share_memory(a,b[,max_work])
byte_bounds(a) 返回指向数组结尾的指针

Array Mixin

Function Desc
lib.mixins.NDArrayOperatorsMixin 定义了所有使用array_ufunc特殊方法
lib.NumpyVersion(vstring) 解析、比较NumPy版本
get_include() 返回头文件目录
deprecate(*args,**kwargs) 废弃警告
deprecate_with_doc(msg)
who([vardict]) 在指定字典中打印数组
disp(mesg[,device,linefee]) 展示信息

浮点错误处理

  • 错误处理
    • 设置硬件平台上注册的错误处理,如:除零错误
    • 基于线程设置
Function Desc
seterr([all,divide,over,under,invalid]) 设置浮点错误处理
seterrcall(func) 设置浮点错误回调或log
geterr() 获取当前处理浮点错误的方法
geterrcall() 获取当前处理浮点错误回调函数
errstate(**kwargs) 浮点错误处理上下文
seterrobj(errobj) 设置定义浮点错误处理的对象
geterrobj() 获取定义浮点错误处理的对象

NumPy帮助

Function Desc
lookfor(what[,module,import_modules]) 在文档中搜索关键词
info([object,maxwidth,output,toplevel]) 获取帮助信息
source(object[,output]) 获取源码

Numpy 附加库

财金

Function Desc
fv(rate,nper,pmt,pv[,when]) 未来值
pv(rate,nper,pmt[,fv,when]) 现值
npv(rate,values) 净现值
pmt(rate,nper,pv[,fv,when]) 等额本息,每期付款
ppmt(rate,per,nper,pv[,fv,when]) 等额本息中第per期本金
ipmt(rate,per,nper,pv[,fv,when]) 等额本息中第per期利息
irr(values) 内部收益率
mirr(values,finance_rate,reinvest_rate) 考虑期内再融资成本finance_rate、收益再投资收益reinvest_rate
nper(rate,pmt,pv[,fv,when]) 每期付款
rate(nper,pmt,pv,fv[,when,guess,tol,...]) 每期间的利率
  • 参数说明

    • pv:现值
    • fv:未来值
    • when:期初或期末付款
      • 0/end
      • 1/begin
    • pmtPayment,每期付款
    • ppmtPrinciple of Payment,每期付款中本金
    • ipmtInterest of Payment,每期付款中利息
  • 值说明

    • 正值:收入
    • 负值:支出

Histogram

Function Desc
histogram(a[,bins,range,normed,weights,...])
histogram2d(x,y[,bins,range,normed,weights,...])
histogramdd(sample[,bins,range,normed,weights,...])
bincount(x[,weights,minlength])
histogram_bin_edges(a[,bin,range,weights])
digitize(x,bins[,right])

Set

Operation

Routine Function Version
in1d(ar1,ar2[,assume_unique,invert]) 是否包含,始终返回1维数组
isin(element,test_element[,...]) 保持elementshape返回
intersect1d(ar1,ar2[,assume_unique,...]) 交集
union1d(ar1,ar2[,assume_unique,...]) 并集
setdiff1d(ar1,ar2[,assume_unique,...]) ar1-ar2
setxor1d(ar1,ar2[,assume_unique,...]) 差集

Unique

Routine Function Version
unique(ar[,return_index,return_inverse,return_counts,axis]) 返回唯一值

Numpy 索引

索引、切片

基本切片、索引

  • 基本切片[Slice]start:stop:step(基本同原生类型切片)

    • startstop负值时,按维度长取正模
    • step>0时,start缺省为0stop缺省为维度长N
    • step<0时,start缺省为N-1stop缺省为-N-1
    • stopstart可以超过维度长N
  • Ellipsis/...:放在切片中表示选择所有

    • ...存在的场合,结果总是数组而不是数组标量,即使其 没有大小
  • np.newaxis/None:为切片生成数组在所在位置添加长度为 1的维度

  • 切片可以用于设置数组中的值

  • 基本切片可认为是依次对各维度切片,若靠前维度为索引,则 可以把靠前维度独立出来
  • 基本切片生成的所有数组始终是原始数组的视图,也因此存在 切片引用的数组内存不会被释放
  • 注意:基本索引可用于改变数组的值,但是返回值不是对数组 中对应值的引用

高级索引

  • 选择对象为以下类型时会触发高级索引

    • 非元组序列
    • ndarray(整形或boolean类型)
    • 包含至少一个序列、ndarray(整型或boolean类型)的 元组
  • 高级索引总是返回数据的副本

    • 高级索引结果不能保证任何内存布局

整数索引

  • 整数索引X[obj]允许根据其各维度索引选择数组X任意元素

    • 各整数索引(数组)表示对应维度的索引
    • 各维度索引迭代、连接得到各元素位置:zip(obj*)
    • 索引维数小于数组维数时,以子数组作为元素 (可以理解为索引和数组高维对齐后广播)
  • 整数索引结果shape由obj中各维度索引shape决定

    • 整数索引obj中各维度索引数组会被广播
      • 各维度索引shape可能不同
      • 为保证各维度索引能正常迭代选取元素,各维度索引 shape需要能被广播、符合广播要求
    • 则高级索引出现场合
      • “普通索引(标量值)”不存在,必然被广播
      • 切片能够共存
  • 切片(包括np.newaxis)和高级索引共存时

    • 高级索引特点导致其结果维度不可割
      • “标量索引”本应削减该维度
      • 而高级索引整体(广播后)决定唯一shape
    • 高级索引结果维度应整体参与结果构建
      • 高级索引被切片分割:高级索引结果维度整体提前
      • 高级索引相邻:高级索引结果维度填充至该处
  • 高级索引操作结果中无元素,但单个维度索引越界的错误未定义
  • 高级索引结果内存布局对每个索引操作有优化,不能假设特定 内存顺序
1
2
3
4
5
6
7
8
X = np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])
rows = [0, 3]
cols = [0, 2]
# 整数索引
X[np.ix_(rows, cols)]
# 整数索引数组
X[[[1,2],[2,1]],:]
X.take([[1,2],[2,1]], axis=0)

Boolean索引

  • Boolean索引obj选择其中True处位置对应元素

    • 索引obj维数较数组X小,直接抽取子数组作为元素 (可以理解为索引和数组高维对齐后广播)
    • 索引obj在超出数组X.shape范围处有True值,会引发 索引错误
    • 索引objX.shape内未填充处等同于填充False
  • Boolean索引通过.nonezero方法转换为高级整数索引实现

    • Boolean索引等价于True数量长的1维整数索引
      • X[..,bool_obj,..]等价于 X[..,bool_obj.nonzero(),..]
      • Boolean索引总是削减对应索引,展开为1维
    • Boolean索引、高级整数索引共同存在场合行为诡异
      • Boolean索引转换为等价的整数索引
      • 整数索引需要广播兼容转换后整数索引
      • 整数索引、转换后整数索引整体得到结果
  • 索引obj和数组X形状相同计算速度更快

字段名称形式访问

  • ndarray中元素为结构化数据类型时,可以使用字符串索引 访问
    • 字段元素非子数组时
      • 其shape同原数组
      • 仅包含该字段数据
      • 数据类型为该字段数据类型
    • 字段元素为子数组时
      • 子数组shape会同原数组shape合并
    • 支持字符串列表形式访问
      • 返回数组视图而不是副本(Numpy1.6后)

Universal Functions

Universal Functions

  • UFunc:在数组上执行逐元素运算函数

    • 支持广播、类型映射等
    • 可视为是函数的向量化包装
    • 基本ufunc在标量上执行操作,更泛化的ufunc也可以 在以子数组为基本元素进行操作
  • numpy中的ufuncnp.ufunc的实例

    • 许多内建的ufunc是通过C编译实现的
    • 可以通过np.frompyfunc工厂方法自定义ufunc实例
    • numpy中包含超过60种ufunc
      • 部分ufunc在相关运算标记调用时,会被自动调用

内部缓冲

  • Internal Buffers
    • 用于数据非对齐、数据交换、数据类型转换场合
    • .setbufsize(size):基于线程设置内部缓冲,缺省为 10,000元素

类型转换规则

  • ufunc内部维护列表,给出适用的输入类型(组合)、 相应的输出类型 (可通过.types属性查看)

  • ufunc内部列表中没有给定的输入类型组合时,则需要 进行safely类型转换 (可通过np.can_cast函数判断)

    • "S", "U", "V"类型不能支持ufunc运算
    • 标量-数组操作使用不同类型转换规则确保标量不会降低 数组精度,除非标量和数组属于同一类型体系

UFunc维度说明

  • core dimension:核心维度,ufunc执行操作所在的维度

    • 核心维度一般使用元组表示
      • 对一般ufunc:核心维度为空元组
      • 对广义ufunc:核心维度为非空元组、空元组
    • signature:签名,包含ufunc涉及的输出操作数和输出 操作数的核心维度字符串,如:(i,),(j,)->()
    • 签名中各输入操作数的对应核心维度大小必须相同,移除后 剩余的循环维度共同广播,加上输出操作数的核心维度得到 输出结果shape
  • loop dimension:循环维度,除核心维度之外的维度

UFunc原型

1
2
3
4
5
6
7
8
9
10
NDA = def numpy.<ufunc>(
x1 [,x2], /,
[out1, out2,], out, *,
where=True,
casting="same_kind",
order="K",
dtype=None,
subok=True,
[signature, extobj]
)
  • where=True/False/Array[bool]

    • 此参数不用于对子数组做操作的广义ufunc
  • keepdims=False/True

    • 对广义ufunc,只在输入操作数上有相同数量核心维度、 输出操作数没有核心维度(即返回标量)时使用
  • axes=tuple/int

    • 含义:广义ufunc执行操作、存储结果所在的轴序号
      • [tuple]:各元组为各输入操作数应被执行操作、 输出操作数存储结果的轴的序号
      • [int]:广义ufunc在1维向量上执行操作时,可以 直接使用整形
    • 若广义ufunc的输出操作数均为标量,可省略其对应元组
  • axis=int

    • 含义:广义ufunc执行操作所在的single轴序号
      • int:广义ufunc在相同的轴axis上执行操作, 等价于axes=[(axis,),(axis,),...]
  • signature=np.dtype/tuple[np.dtype]/str

    • 含义:指示ufunc的输入、输出的数据类型,
    • 对于底层计算1维loop,是通过比较输入的数据类型,找到 让所有输入都能安全转换的数据类型
      • 此参数允许绕过查找,直接指定loop
    • 可通过ufunc.types属性查看可用的signature列表
  • extobj=list

    • 含义:指定ufunc的缓冲大小、错误模式整数、错误处理 回调函数
      • list:长度为1、或2、或3的列表
    • 默认这些值会在对应线程字典中查找,此参数可以通过更 底层的控制
      • 可优化在小数组上大量ufunc的调用
  • 部分参数含义通用,参见README

UFunc属性

Attr Desc
ufunc.nin 输入数量
ufunc.nout 输出数量
ufunc.nargs 参数数量
ufunc.ntypes 类型数量
ufunc.types input->output列表
ufunc.identity 标志值
ufunc.signature 广义ufunc执行操作所在的核心元素的定义

UFunc方法

Method Desc
ufunc.reduce(a[,axis,dtype,out,...]) 通过沿轴应用ufunc缩减维度
ufunc.accumulate(array[,axis,dtype,out]) 累加所有元素的计算结果
ufunc.reduceat(a,indice[,axis,dtype,out]) 在single轴指定切片上执行reduce
ufunc.outer(A,B,**kwargs) 在分属A,B的元素对上应用ufunc
ufunc.at(a,indices[,b]) indices处在位无缓冲执行操作
  • 所有ufunc都有4个方法,但是这些方法只在标量ufunc、 包含2输入参数、1输出参数里有价值,否则导致ValueError

UFunc相关函数

Function Desc
apply_along_axis(func1d,axis,arr,*args,...) 沿给定轴应用函数
apply_over_axes(func,a,axes) 依次沿给定轴应用函数func(a,axis)
frompyfunc(func,nin,nout[,identity]) 创建ufunc,指定输入、输出数量
vertorize(pyfunc[,otypes,doc,excluded,cache,signature]) 创建ufunc,较frompyfunc提供更多特性
piecewise(x,condlist,funclist,*args,**kw) 按照condlist中索引,对应应用funclist中函数

NDArray开发

NDArray Interface/Protocol

  • 数组接口(规范):为重用数据缓冲区设计的规范
    • 接口描述内容
      • 获取ndarray内容的方式
      • 数组需为同质数组,即其中各元素数据类型相同
    • 接口包含C和Python两个部分
      • Python-API:对象应包含属性__array_interface__字典
      • C-API:结构体__array_struct__

https://www.numpy.org.cn/en/reference/arrays/interface.html#python-side

Python API

  • __array_interface__:由3个必须字段和5个可选字段构成
  • shape:各维度长度(使用时注意取值范围)

  • typestr:指明同质数组数据类型的字符串

    • 格式、含义基本同Array-Protocol,但有部分字符 含义不同
    • 但不同于自定义数据类型字符串,不指定结构化数据、 shape,非基本类型就是void,具体含义由descr 给出

    |代码|类型| |——-|——-| |'t'|bit| |'b'|boolean| |'B'|unsigned byte| |'i'|(signed) integer| |'u'|unsigned integer| |'f'|floating-point| |'c'|complex-floating point| |'m'|timedelta| |'M'|datetime| |'O'|(Python) objects| |'S'/'a'|zero-terminated bytes (not recommended)| |'U'|Unicode string| |'V'|raw data (void)|

  • descr:给出同质数组中各元素中内存布局的详细描述的 列表

    • 各元素为包含2、3个元素的元组
      • 名称:字符串、或(<fullname>,<basicname>) 形式的元组
      • 类型:描述基础类型字符串、或嵌套列表
      • shape:该结构的重复次数,若没有给出则表示无 重复
    • 一般此属性在typestr为取值为V[0-9]+时使用, 要求表示的内存字节数相同
    • 缺省为[(''), typestr]
  • data:给出数据位置的2元素元组或暴露有缓冲接口 的对象

    • 元组首个元素:表示存储数组内容的数据区域,指向 数据中首个元素(即offset被忽略)
    • 元素第二个元素:只读标记
    • 缺省为None,表示内存共享通过缓冲接口自身实现, 此时offset用于指示缓冲的开始
  • strides:存储各维度跃迁的strides的元组

    • 元组各元素为各维度跃迁字节数整形值,注意取值范围
    • 缺省为None,C-contiguous风格
  • mask:指示数据是否有效的暴露有缓冲接口的对象

    • 其shape需要同原始数据shape广播兼容
    • 缺省为None,表示所有数据均有效
  • offset:指示数组数据区域offset的整形值

    • 仅在数据为None或为buffer对象时使用
    • 缺省为0
  • version:指示接口版本

C API

  • __array_struct__:ctype的PyCObject,其中voidptr 指向PyArrayInterface

    • PyCObject内存空间动态分配
    • PyArrayInterface有相应的析构,访问其之后需要在其上 调用Py_DECREF
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    typedef struct{
    int two; // 值为2,sanity check
    int nd; // 维数
    char typekind; // 数组中数据类型
    int itemsize; // 数据类型size
    int flags; // 指示如何解释数据的标志
    // 5bits指示数据解释的5个标志位
    // `CONTIGUOUS` 0x01
    // `FROTRAN` 0x02
    // `ALIGNED` 0x100
    // `NOTSWAPPED` 0x200
    // `WRITABLE` 0X400
    // 1bit指示接口解释(是否包含有效`descr`字段)
    // `ARR_HAS_DESCR` 0x800
    Py_intptr_t *shape; // shape
    Py_intptr_t *strides; // strides
    void *data; // 指向数组中首个元素
    PyObject *descr; // NULL或数据描述(需设置`flags`中的`ARR_HAS_DESCR`,否则被忽略)
    } PyArrayInterface;

NDArray子类

子类相关钩子属性、方法

__array__方法

  • class.__array_ufunc__(ufunc, method, *inputs, **kwargs)

    • 功能:供自定义以覆盖numpy中ufunc行为
      • 返回操作结果,或NotImplemented (将此方法置None
    • 参数
      • ufunc:被调用的ufunc对象
      • method:字符串,指示调用的ufunc对象的方法
      • inputsufunc顺序参数元组
      • kwargsufunc关键字参数字典
    • Ufunc、与__array_ufunc__关系参见ufunc部分
  • class.__array_function__(func,types,args,kwargs)

    • 参数
      • func:任意callable,以func(*args, **kwargs) 形式调用
      • types:来自实现`
      • argskwargs:原始调用的参数
  • class.__array__finalize(obj)

    • 功能:构造之后更改self的属性
      • 在为obj类型数组分配空间时调用
    • 参数
      • objndarray子类
  • class.__array_prepare__(array,context=None)

    • 功能:在ufunc计算前,将ouput数组转换为子类实例、 更新元数据
      • 调用任何ufunc前,在最高优先级的input数组,或指定 的output数组上调用,返回结果传递给ufunc
      • 默认实现:保持原样
  • class.__array_wrap__(array,context=None)

    • 功能:在将结果返回给用户前,将output数组转换为子类 实例、更新元信息
      • ufunc计算结果返回给用户前,在最高优先级的output 数组、或指定output对象上调用
      • 默认实现:将数组转换为新
  • class.__array__([dtype])

    • 功能:若output对象有该方法,ufunc结果将被写入其 返回值中
  • 若ufunc中所有__array_ufunc__返回NotImplemented,那么 raise TypeError

__array__属性

  • class.__array_priority__
    • 功能:决定返回对象的数据类型(有多种可能性时)
      • 默认值:0.0

Matrix

np.matrix

Matrix对象:继承自ndarray,具有ndarray的属性、方法

  • Matrix对象的特殊行为
    • 维数始终为2
      • .ravel()仍然二维
      • item selection返回二维对象
    • 数学操作
      • 覆盖乘法为矩阵乘法
      • 覆盖幂次为矩阵幂次
    • 属性
      • 默认__array_priority__10.0
  • Matrix类被设计用于与scipy.sparse交互,建议不使用
  • np.matnp.matrix别名

Matrix对象property属性

Property Desc
matrix.T 转置
matrix.H 复数共轭
matrix.I 逆矩阵
matrix.A 返回ndarray

Matrix创建

Routine Desc
np.mat(data[,dtype]) 创建矩阵
np.matrix(data[,dtype,copy]) 不建议使用
np.asmatrix(data[,dtype]) 将数据转换为矩阵
np.bmat(obj[,ldict,gdict]) 从字符串、嵌套序列、数组中构建
  • mp.bmat:可使用Matlab样式字符串表示法创建Matrix
    • 空格分割列
    • ;分割行

np.matlib

  • numpy.matlib模块中包含numpy命名空间下所有函数
    • 返回matrix而不是ndarray
    • matrix被限制为小于2维,会改变形状的函数可能无法 得到预期结果
  • np.matlib是为了方便矩阵运算的模块

np.char

np.chararray

  • np.chararray类:string_unicode_数据类型的增强型 数组,继承自ndarray
    • 继承由Numarray引入的特性:项检索和比较操作中,数组 元素末尾空格被忽略
    • 定义有基于元素的+*%的操作
    • 具有所有标准stringunicode方法,可以逐元素执行
Routine Function Version
char.array(obj[,itemsize,...])
char.asarray(obj[,itemsize,...]) 转换输入为chararray,必要时复制数据
chararray(shape[,itemsize,unicode,...]) 不应直接使用此构造函数
  • np.chararray类是为了后向兼容Numarray,建议使用 object_string_unicode_类型的数组替代,并利用 numpy.char模块的自由函数用于字符串快速向量化操作

NDArray Char Routine

  • np.char/np.core.defchararray模块为np.string_np.unicode_类型的数组提供向量化的字符串操作
    • 基于标准库中stringunicode的方法

字符串操作

Routine Function Version
char.add(x1,x2)
char.multiply(a,i)
char.mod(a,values) %格式化(str.__mod__%调用方法)
char.capialize(a) 首字符大写
char.title(a) 单词首字符大写
char.center(a,width[,fillchar]) a居中、fillchar填充字符串
char.ljust(a,width(,fillchar)) a靠左
char.rjust(a,width(,fillchar)) a靠左
char.zfill(a,width) 0填充左侧
char.char.decode(a[,encoding,errors])
char.char.encode(a[,encoding,errors])
char.char.expandtabs(a[,tabsize]) 替换tab为空格
char.join(sep, seq)
char.lower(a)
char.upper(a)
char.swapcase(a)
char.strip(a[,chars])
char.lstrip(a[,chars])
char.rstrip(a[,chars])
char.partition(a,sep) 从左至右切分一次,返回三元组
char.rpartition(a,sep) 从右至左切分一次
char.split(a[,sep,maxsplit]) 从左至右切分maxsplit次,返回列表
char.rsplit(a[,sep,maxsplit])
char.splitlines(a[,keepends]) 切分行,即\n为切分点
char.replace(a,old,new[,count])

Camparison

Function Desc
equal(x1,x2)
greater(x1,x2)
less(x1,x2)
not_equal(x1,x2)
greater_equal(x1,x2)
less_equal(x1,x2)
compare_chararrays(a,b,com_op,rstrip) com_op指定比较方法

字符串信息

Function Desc
count(a,sub[,start,end]) 统计不重叠sub出现次数
startwith(a,prefix[,start,end])
endswith(a,suffix[,start,end])
find(a,sub[,start,end]) 返回首个sub位置,不存在返回-1
rfind(a,sub[,start,end]) 从右至左find
index(a,sub[,start,end]) find,不存在ValueError
rindex(a,sub[,start,end]) 从右至左index
isalpha(a)
iaalnum(a)
isdecimal(a)
isdigit(a)
islower(a)
isnumeric(a)
isspace(a)
istitle(a) 是否各单词首字符大写
isupper(a)
str_len(a)

np.rec

  • np.rec/np.core.records

np.recarray

  • np.recarray类:允许将结构化数组的字段作为属性访问
Routine Function Version
np.recarray 创建允许属性访问字段的ndarray
np.record 允许使用属性查找字段的数据类型标量

Record Arrays

Routine Function Version
core.records.array(obj[,dtype,shape,...]) 从多类型对象中创建
core.records.fromarrays(arrayList[,dtype,...]) 从数组列表中创建
core.records.fromrecords(recList[,dtype]) 从文本格式的records列表创建
core.records.fromstring(datastring[,dtype,...]) 从二进制数据字符串中创建只读
core.records.fromfile(fd[,dtype,shape,...]) 从二进制文件中创建

np.ma

ma.MaskedArray

  • ma.MaskedArray:掩码数组,是np.ma核心,ndarray子类

    • ma.MaskedArray由标准np.ndarray和掩码组成
  • 掩码数组.mask

    • 掩码可以被设置为hardmasksoftmask,由只读属性 hardmask指定
      • hardmask:无法修改被遮蔽值
      • softmask:可修改被遮蔽值,并恢复被遮蔽状态
    • .mask可以被设置
      • 为bool数组,指示各位置元素是否被遮蔽
      • ma.maskded/ma.unmask/True/False,设置掩码数组 整体是被遮蔽

属性

Attr Desc
.hardmask 硬掩码标志
.data 值数组
.mask 掩码数组、ma.unmaskma.masked
.recordmask 项目中命名字段全遮蔽则遮蔽

创建掩码数组

Routine Function Version Method Version
ma.MaskedArray(data[,mask,dtype,...])
ma.masked_array(data[,mask,dtype,...]) MaskedArray别名
ma.array(data[,dtype,copy,...]) 构造函数
ma.frombuffer(buffer[,dtype,count,offset])
ma.fromfunction(function,shape,dtype)
ma.fromflex(fxarray) 从有_data_mask字段的结构化fxarray中创建
copy(a[,order])
Ones and Zeros
Routine Function Version
ma.empty(shape[,dtype,order]) 无初始化
ma.empty_like(prototype[,dtype,order,subok,...]) shape、类型同prototype
ma.ones(shape[,dtype,order])
ma.zeros(shape[,dtype,order])
ma.masked_all(shape[,dtype]) 所有元素被屏蔽
ma.masked_all_like(shape[,dtype])

MaskedArray Routine

  • np.ma模块下的函数、ma.MaskedArray方法和ndarray 类似,但行为可能不同
    • np命名空间下部分函数(hstack等)应用在 MaskedArray
      • 操作时忽略mask(即会操作被遮罩元素)
      • 返回结果中mask被置为False
  • 这里仅记录ma模块中额外、或需额外说明部分

数组检查

Routine Function Version Method Version
ma.all(a[,axis,out,keepdims]) 全遮蔽时返回ma.masked
ma.any(a[,axis,out,keepdims]) 存在遮蔽时返回ma.masked
ma.count(arr,[axis,keepdims]) 沿给定轴统计未被遮罩元素数量
ma.count_masked(arr,[axis]) 沿给定轴统计被遮罩元素数量
ma.nonzero(a) 非0、未屏蔽元素索引
ma.is_mask(m) 是否为标准掩码数组
ma.is_masked(x) 是否包含遮蔽元素

获取、创建、修改掩码

Routine Function Version Method Version
ma.getmask(a) 返回掩码、或ma.nomaskma.masked .mask属性
ma.getmaskarray(arr) 返回掩码、或完整False数组
ma.make_mask(m[,copy,shrink,dtype]) 从数组创建掩码
ma.make_mask_none(newshape[,dtype]) 创建给定形状掩码
ma.make_mask_descr(ndtype) 为给定类型的创建掩码类型
ma.mask_rowcols(a[,axis]) 遮蔽包含遮蔽元素的axis方向分量
ma.mask_rows(a[,axis]) 缺省为0mask_rowcols()
ma.mask_cols(a[,axis]) 缺省为1mask_rowcols()
ma.mask_mask_or(m1,m2[,copy,shrink]) 掩码或
ma.harden_mask(a)
ma.soften_mask(a)
.shrink_mask() 尽可能缩小掩码
.share_mask() 复制掩码,并设置sharedmask=False

获取、创建索引

  • 索引非结构化掩码数组

    • mask为False:返回数组标量
    • mask为True:返回ma.masked
  • 索引结构化掩码数组

    • 所有字段mask均为False:返回np.void对象
    • 存在字段mask为True:返回零维掩码数组
  • 切片

    • .data属性:原始数据视图
    • .mask属性:ma.nomask或者原始mask视图
Routine Function Version Method Version
ma.nonzero(a) 未屏蔽、非0元素索引
ma.mr_[] 沿第1轴concate切片、数组、标量,类np.r_[]
ma.flatnotmasked_contiguous(a) 展平后未遮蔽切片
ma.flatnotmasked_edges(a) 展平后首个、末个未遮蔽位置
ma.notmasked_contiguous(a[,axis]) 沿给定轴,未遮蔽切片
ma.notmasked_edges(a[,axis]) 沿给定轴,首个、末个未遮蔽位置
ma.clump_masked(a) 展平后遮蔽切片
ma.clump_unmasked(a) 展位后未遮蔽切片
  • ma.mr_[]类似np.r_[],但np.r_[]返回结果掩码被置为 False,而ma.mr_[]同时也操作掩码

获取、修改值

  • 仅访问有效数据

    • 对掩码mask取反作为索引~X.mask
    • 使用.compressed方法得到一维ndarray
    1
    2
    print(X[~X.mask])
    print(X.compressed())
  • 访问数据

    • 通过.data属性:可能是ndarray或其子类的视图
      • 等同于直接在掩码数组上创建ndarray或其子类视图
    • __array__方法:ndarray
    • 使用ma.getdata函数
Routine Function Version Method Version
ma.getdata(a[,subok]) 返回掩码数组数据 .data属性
ma.fix_valid(a[,mask,copy,fill_value]) 替换a中无效值,并遮盖
ma.masked_equal(x,value[,copy])
ma.masked_greater(x,value[,copy])
ma.masked_greater_equal(x,value[,copy])
ma.masked_inside(x,v1,v2[,copy])
ma.masked_outside(x,v1,v2[,copy])
ma.masked_invalid(x[,copy])
ma.masked_less(x,value[,copy])
ma.masked_less_equal(x,value[,copy])
ma.masked_not_equal(x,value[,copy])
ma.masked_values(x,value[,rtol,atol,...])
ma.masked_object(x,value[,copy,shrink]) masked_values,适合值类型为object
ma.masked_where(condition,a[,copy]) condition遮蔽指定值

其他属性、方法

Routine Function Version Method Version
ma.common_fill_value(a,b) a,b填充值相同则返回,否则返回None
ma.default_fill_value(obj) 默认填充值
ma.maximum_fill_value(obj) 对象类型决定的最大值
ma.minimum_fill_value(obj)
ma.sef_fill_value(a,fill_value)
.get_fill_value()/.fill_value
ma.allequal(a,b[,fill_value]) a,b元素均相等,则使用fill_value填充

np.ma运算

  • 掩码数组支持代数、比较运算

    • 被遮蔽元素不参与运算,元素在运算前后保持不变
    • 掩码数组支持标准的ufunc,返回掩码数组
      • 运算中任意元素被遮蔽,则结果中相应元素被遮蔽
      • ufunc返回可选的上下文输出,则上下文会被处理, 且无定义结果被遮蔽
  • np.ma模块中对大部分ufunc有特别实现

    • 对于定义域有限制的一元、二元运算,无定义的结果会 自动mask
    1
    ma.log([-1, 0, 1, 2])
Routine Function Version Method Version
ma.anom(a[,axis,dtype]) 沿给定轴计算与算数均值的偏差

np.memmap

  • np.memmap:内存映射文件数组,使用内存映射文件作为数组 数据缓冲区

    • 对大文件,使用内存映射可以节省大量资源
  • 方法

    |Method|Desc| |——-|——-| |np.memmap(filename[,dtype,mode,shape])|创建存储在磁盘文件的内存映射数组| |np.flush()|flush内存数据至磁盘|

标准容器类

  • np.lib.user_array.container

    • 为向后兼容、作为标准容器类而引入
    • 其中self.array属性是ndarray
    • ndarray本身更方便多继承
  • 类、方法、函数

    |Method|Desc| |——-|——-| |np.lib.user_array.container(data[,...])|简化多继承的标准容器类|