数学基础
- 线性代数
- 概率论与随机过程
- 数值计算
- 蒙特卡洛方法与 MCMC 采样
- 机器学习方法概论
统计学习
深度学习
- 深度学习简介
- 深度前馈网络
- 反向传播算法
- 正则化
- 深度学习中的最优化问题
- 卷积神经网络
- CNN:图像分类
- 循环神经网络 RNN
- Transformer
- 一、Transformer [2017]
- 二、Universal Transformer [2018]
- 三、Transformer-XL [2019]
- 四、GPT1 [2018]
- 五、GPT2 [2019]
- 六、GPT3 [2020]
- 七、OPT [2022]
- 八、BERT [2018]
- 九、XLNet [2019]
- 十、RoBERTa [2019]
- 十一、ERNIE 1.0 [2019]
- 十二、ERNIE 2.0 [2019]
- 十三、ERNIE 3.0 [2021]
- 十四、ERNIE-Huawei [2019]
- 十五、MT-DNN [2019]
- 十六、BART [2019]
- 十七、mBART [2020]
- 十八、SpanBERT [2019]
- 十九、ALBERT [2019]
- 二十、UniLM [2019]
- 二十一、MASS [2019]
- 二十二、MacBERT [2019]
- 二十三、Fine-Tuning Language Models from Human Preferences [2019]
- 二十四 Learning to summarize from human feedback [2020]
- 二十五、InstructGPT [2022]
- 二十六、T5 [2020]
- 二十七、mT5 [2020]
- 二十八、ExT5 [2021]
- 二十九、Muppet [2021]
- 三十、Self-Attention with Relative Position Representations [2018]
- 三十一、USE [2018]
- 三十二、Sentence-BERT [2019]
- 三十三、SimCSE [2021]
- 三十四、BERT-Flow [2020]
- 三十五、BERT-Whitening [2021]
- 三十六、Comparing the Geometry of BERT, ELMo, and GPT-2 Embeddings [2019]
- 三十七、CERT [2020]
- 三十八、DeCLUTR [2020]
- 三十九、CLEAR [2020]
- 四十、ConSERT [2021]
- 四十一、Sentence-T5 [2021]
- 四十二、ULMFiT [2018]
- 四十三、Scaling Laws for Neural Language Models [2020]
- 四十四、Chinchilla [2022]
- 四十七、GLM-130B [2022]
- 四十八、GPT-NeoX-20B [2022]
- 四十九、Bloom [2022]
- 五十、PaLM [2022] (粗读)
- 五十一、PaLM2 [2023](粗读)
- 五十二、Self-Instruct [2022]
- 句子向量
- 词向量
- 传统CTR 预估模型
- CTR 预估模型
- 一、DSSM [2013]
- 二、FNN [2016]
- 三、PNN [2016]
- 四、DeepCrossing [2016]
- 五、Wide 和 Deep [2016]
- 六、DCN [2017]
- 七、DeepFM [2017]
- 八、NFM [2017]
- 九、AFM [2017]
- 十、xDeepFM [2018]
- 十一、ESMM [2018]
- 十二、DIN [2017]
- 十三、DIEN [2019]
- 十四、DSIN [2019]
- 十五、DICM [2017]
- 十六、DeepMCP [2019]
- 十七、MIMN [2019]
- 十八、DMR [2020]
- 十九、MiNet [2020]
- 二十、DSTN [2019]
- 二十一、BST [2019]
- 二十二、SIM [2020]
- 二十三、ESM2 [2019]
- 二十四、MV-DNN [2015]
- 二十五、CAN [2020]
- 二十六、AutoInt [2018]
- 二十七、Fi-GNN [2019]
- 二十八、FwFM [2018]
- 二十九、FM2 [2021]
- 三十、FiBiNET [2019]
- 三十一、AutoFIS [2020]
- 三十三、AFN [2020]
- 三十四、FGCNN [2019]
- 三十五、AutoCross [2019]
- 三十六、InterHAt [2020]
- 三十七、xDeepInt [2023]
- 三十九、AutoDis [2021]
- 四十、MDE [2020]
- 四十一、NIS [2020]
- 四十二、AutoEmb [2020]
- 四十三、AutoDim [2021]
- 四十四、PEP [2021]
- 四十五、DeepLight [2021]
- 图的表达
- 一、DeepWalk [2014]
- 二、LINE [2015]
- 三、GraRep [2015]
- 四、TADW [2015]
- 五、DNGR [2016]
- 六、Node2Vec [2016]
- 七、WALKLETS [2016]
- 八、SDNE [2016]
- 九、CANE [2017]
- 十、EOE [2017]
- 十一、metapath2vec [2017]
- 十二、GraphGAN [2018]
- 十三、struc2vec [2017]
- 十四、GraphWave [2018]
- 十五、NetMF [2017]
- 十六、NetSMF [2019]
- 十七、PTE [2015]
- 十八、HNE [2015]
- 十九、AANE [2017]
- 二十、LANE [2017]
- 二十一、MVE [2017]
- 二十二、PMNE [2017]
- 二十三、ANRL [2018]
- 二十四、DANE [2018]
- 二十五、HERec [2018]
- 二十六、GATNE [2019]
- 二十七、MNE [2018]
- 二十八、MVN2VEC [2018]
- 二十九、SNE [2018]
- 三十、ProNE [2019]
- Graph Embedding 综述
- 图神经网络
- 一、GNN [2009]
- 二、Spectral Networks 和 Deep Locally Connected Networks [2013]
- 三、Fast Localized Spectral Filtering On Graph [2016]
- 四、GCN [2016]
- 五、神经图指纹 [2015]
- 六、GGS-NN [2016]
- 七、PATCHY-SAN [2016]
- 八、GraphSAGE [2017]
- 九、GAT [2017]
- 十、R-GCN [2017]
- 十一、 AGCN [2018]
- 十二、FastGCN [2018]
- 十三、PinSage [2018]
- 十四、GCMC [2017]
- 十五、JK-Net [2018]
- 十六、PPNP [2018]
- 十七、VRGCN [2017]
- 十八、ClusterGCN [2019]
- 十九、LDS-GNN [2019]
- 二十、DIAL-GNN [2019]
- 二十一、HAN [2019]
- 二十二、HetGNN [2019]
- 二十三、HGT [2020]
- 二十四、GPT-GNN [2020]
- 二十五、Geom-GCN [2020]
- 二十六、Graph Network [2018]
- 二十七、GIN [2019]
- 二十八、MPNN [2017]
- 二十九、UniMP [2020]
- 三十、Correct and Smooth [2020]
- 三十一、LGCN [2018]
- 三十二、DGCNN [2018]
- 三十三、AS-GCN
- 三十四、DGI [2018]
- 三十五、DIFFPOLL [2018]
- 三十六、DCNN [2016]
- 三十七、IN [2016]
- 图神经网络 2
- 图神经网络 3
- 推荐算法(传统方法)
- 一、Tapestry [1992]
- 二、GroupLens [1994]
- 三、ItemBased CF [2001]
- 四、Amazon I-2-I CF [2003]
- 五、Slope One Rating-Based CF [2005]
- 六、Bipartite Network Projection [2007]
- 七、Implicit Feedback CF [2008]
- 八、PMF [2008]
- 九、SVD++ [2008]
- 十、MMMF 扩展 [2008]
- 十一、OCCF [2008]
- 十二、BPR [2009]
- 十三、MF for RS [2009]
- 十四、 Netflix BellKor Solution [2009]
- 推荐算法(神经网络方法 1)
- 一、MIND [2019](用于召回)
- 二、DNN For YouTube [2016]
- 三、Recommending What Video to Watch Next [2019]
- 四、ESAM [2020]
- 五、Facebook Embedding Based Retrieval [2020](用于检索)
- 六、Airbnb Search Ranking [2018]
- 七、MOBIUS [2019](用于召回)
- 八、TDM [2018](用于检索)
- 九、DR [2020](用于检索)
- 十、JTM [2019](用于检索)
- 十一、Pinterest Recommender System [2017]
- 十二、DLRM [2019]
- 十三、Applying Deep Learning To Airbnb Search [2018]
- 十四、Improving Deep Learning For Airbnb Search [2020]
- 十五、HOP-Rec [2018]
- 十六、NCF [2017]
- 十七、NGCF [2019]
- 十八、LightGCN [2020]
- 十九、Sampling-Bias-Corrected Neural Modeling [2019](检索)
- 二十、EGES [2018](Matching 阶段)
- 二十一、SDM [2019](Matching 阶段)
- 二十二、COLD [2020 ] (Pre-Ranking 模型)
- 二十三、ComiRec [2020](https://www.wenjiangs.com/doc/0b4e1736-ac78)
- 二十四、EdgeRec [2020]
- 二十五、DPSR [2020](检索)
- 二十六、PDN [2021](mathcing)
- 二十七、时空周期兴趣学习网络ST-PIL [2021]
- 推荐算法之序列推荐
- 一、FPMC [2010]
- 二、GRU4Rec [2015]
- 三、HRM [2015]
- 四、DREAM [2016]
- 五、Improved GRU4Rec [2016]
- 六、NARM [2017]
- 七、HRNN [2017]
- 八、RRN [2017]
- 九、Caser [2018]
- 十、p-RNN [2016]
- 十一、GRU4Rec Top-k Gains [2018]
- 十二、SASRec [2018]
- 十三、RUM [2018]
- 十四、SHAN [2018]
- 十五、Phased LSTM [2016]
- 十六、Time-LSTM [2017]
- 十七、STAMP [2018]
- 十八、Latent Cross [2018]
- 十九、CSRM [2019]
- 二十、SR-GNN [2019]
- 二十一、GC-SAN [2019]
- 二十二、BERT4Rec [2019]
- 二十三、MCPRN [2019]
- 二十四、RepeatNet [2019]
- 二十五、LINet(2019)
- 二十六、NextItNet [2019]
- 二十七、GCE-GNN [2020]
- 二十八、LESSR [2020]
- 二十九、HyperRec [2020]
- 三十、DHCN [2021]
- 三十一、TiSASRec [2020]
- 推荐算法(综述)
- 多任务学习
- 系统架构
- 实践方法论
- 深度强化学习 1
- 自动代码生成
工具
- CRF
- lightgbm
- xgboost
- scikit-learn
- spark
- numpy
- matplotlib
- pandas
- huggingface_transformer
- 一、Tokenizer
- 二、Datasets
- 三、Model
- 四、Trainer
- 五、Evaluator
- 六、Pipeline
- 七、Accelerate
- 八、Autoclass
- 九、应用
- 十、Gradio
Scala
- 环境搭建
- 基础知识
- 函数
- 类
- 样例类和模式匹配
- 测试和注解
- 集合 collection(一)
- 集合collection(二)
- 集成 Java
- 并发
一、 ndarray
1. ndarray 对象的内存结构
ndarray
对象在内存中的结构如下:ndarray.dtype
:存储了数组保存的元素的类型。float32
ndarray.ndim
:它是一个整数,保存了数组的维度,即多少个轴ndarray.shape
:它是一个整数的元组,每个元素一一对应地保存了数组某个维度的大小(即某个轴的长度)。ndarray.strides
:它是一个整数的元组,每个元素保存着每个轴上相邻两个元素的地址差。即当某个轴的下标增加1 时,数据存储区中的指针增加的字节数ndarray.data
:它指向数组的数据的存储区
可以看到:该数组中元素类型为
float32
;该数组有2 个轴。每个轴的长度都是 3 个元素。第 0 轴增加1时,下标增加 12字节(也就是 3个元素,即一行的距离); 第 1 轴增加 1时,下标增加 4字节(也就是一个元素的距离)。元素在数据存储区中的排列格式有两种:
C
语言格式和Fortran
语言格式。C
语言中,多维数组的第 0 轴是最外层的。即 0 轴的下标增加 1时,元素的地址增加的字节数最多Fortran
语言中,多维数组的第 0 轴是最内层的。即 0 轴的下标增加 1时,元素的地址增加的字节数最少
numpy
中默认是以C
语言格式存储数据。如果希望改为Fortran
格式,则只需要在创建数组时,设置order
参数为"F"
数组的
flags
属性描述了数据存储区域的一些属性。你可以直接查看flags
属性,也可以单独获取其中某个标志值。C_CONTIGUOUS
:数据存储区域是否是C
语言格式的连续区域F_CONTIGUOUS
:数据存储区域是否是F
语言格式的连续区域OWNDATA
:数组是否拥有此数据存储区域。当一个数组是其他数组的视图时,它并不拥有数据存储区域,通过视图数组的base
属性可以获取保存数据存储区域的那个原始数组。
数组的转置可以通过其
T
属性获取。转置数组可以简单的将其数据存储区域看作是Fortran
语言格式的连续区域,并且它不拥有数据存储区域。修改数组的内容时,会直接修改数据存储区域。所有使用该数据存储区域的数组都将被同时修改!
1.1 dtype
numpy
有自己的浮点数类型:float16/float32/float64/float128
等等。- 在需要指定
dtype
参数时,你可以使用numpy.float16
,也可以传递一个表示数值类型的字符串。numpy
中的每个数值类型都有几种字符串表示。字符串和类型之间的对应关系都存储在numpy.typeDict
字典中。 dtype
是一种对象,它不同于数值类型。只有dtype.type
才能获取对应的数值类型- 你可以通过
np
的数值类型np.float32
来创建数值对象。但要注意:numpy
的数值对象的运算速度比python
内置类型的运算速度要慢很多。所以应当尽量避免使用numpy
的数值对象
- 在需要指定
使用
ndarray.astype()
方法可以对数组元素类型进行转换。
1.2 shape
你可以使用
ndarray.reshape()
方法调整数组的维度。- 你可以在某个维度设置其长度为 -1,此时该维度的长度会被自动计算
你可以直接修改
ndarry
的shape
属性,此时直接修改原始数组。- 你可以在某个维度设置其长度为 -1,此时该维度的长度会被自动计算
1.3 view
- 我们可以通过
ndarray.view()
方法,从同一块数据区创建不同的dtype
数组。即使用不同的数值类型查看同一段内存中的二进制数据。它们使用的是同一块内存。 - 如果我们直接修改原始数组的
dtype
,则同样达到这样的效果,此时直接修改原始数组。
1.4 strides
- 我们可以直接修改
ndarray
对象的strides
属性。此时修改的是原始数组。 - 你可以使用
np.lib.stride_tricks.as_stride()
函数创建一个不同strides
的视图。 注意:使用as_stride
时并不会执行内存越界检查,因此shape
和stride
设置不当可能会发生意想不到的错误。
1.5 拷贝和视图
当处理
ndarray
时,它的数据存储区有时被拷贝,但有时并不被拷贝。有三种情况。完全不拷贝:简单的赋值操作并不拷贝
ndarray
的任何数据,这种情况下是新的变量引用ndarray
对象(类似于列表的简单赋值)视图和浅拷贝:不同的
ndarray
可能共享相同的数据存储区。如ndarray.view()
方法创建一个新的ndarray
但是与旧ndarray
共享相同的数据存储区。新创建的那个数组称作视图数组。- 对于视图数组,
ndarray.base
返回的是拥有数据存储区的那个底层ndarray
。而非视图数组的ndarray.base
返回None
ndarray.flags.owndata
返回数组是否拥有基础数据- 对于数组的分片操作返回的是一个
ndarray
的视图。对数组的索引返回的不是视图,而是含有基础数据。
- 对于视图数组,
深拷贝:
ndarray.copy()
操作会返回一个完全的拷贝,不仅拷贝ndarray
也拷贝数据存储区。
2. 数组的创建
这里有几个共同的参数:
a
:一个array-like
类型的实例,它不一定是数组,可以为list
、tuple
、list of tuple
、list of list
、tuple of list
、tuple of tuple
等等。dtype
:数组的值类型,默认为float
。你可以指定Python
的标准数值类型,也可以使用numpy
的数值类型如:numpy.int32
或者numpy.float64
等等。order
:指定存储多维数据的方式。- 可以为
'C'
,表示按行优先存储(C风格); - 可以为
'F'
,表示按列优先存储(Fortran风格)。 - 对于
**_like()
函数,order
可以为:'C'
,'F'
,'A'
(表示结果的order
与a
相同),'K'
(表示结果的order
与a
尽可能相似)
- 可以为
subok
:bool
值。如果为True
则:如果a
为ndarray
的子类(如matrix
类),则结果类型与a
类型相同。如果为False
则:结果类型始终为ndarray
。默认为True
。
2.1 创建全1或者全0
np.empty(shape[,dtype,order])
:返回一个新的ndarray
,指定了shape
和dtype
,但是没有初始化元素。因此其内容是随机的。np.empty_like(a[,dtype,order,subok])
:返回一个新的ndarray
,shape
与a
相同,但是没有初始化元素。因此其内容是随机的。
np.eye(N[, M, k, dtype])
:返回一个二维数组,对角线元素为1,其余元素为0。M
默认等于N
。k
默认为0表示对角线元素为1,如为正数则表示对角线上方一格的元素为1,如为负数表示对角线下方一格的元素为1.np.identity(n[, dtype])
:返回一个单位矩阵
np.ones(shape[, dtype, order])
:返回一个新的ndarray
,指定了shape
和type
,每个元素初始化为1.np.ones_like(a[, dtype, order, subok])
:返回一个新的ndarray
,shape
与a
相同,每个元素初始化为1。
np.zeros(shape[, dtype, order])
:返回一个新的ndarray
,指定了shape
和type
,每个元素初始化为0.np.zeros_like(a[, dtype, order, subok])
:返回一个新的ndarray
,shape
与a
(另一个数组)相同,每个元素初始化为0。
np.full(shape, fill_value[, dtype, order])
:返回一个新的ndarray
,指定了shape
和type
,每个元素初始化为fill_value
。np.full_like(a, fill_value[, dtype, order, subok])
:返回一个新的ndarray
,shape
与a
相同,每个元素初始化为fill_value
。
2.2 从现有数据创建
np.array(object[, dtype, copy, order, subok, ndmin])
:从object
创建。object
可以是一个ndarray
,也可以是一个array_like
的对象,也可以是一个含有返回一个序列或者ndarray
的__array__
方法的对象,或者一个序列。copy
:默认为True
,表示拷贝对象order
可以为'C'、'F'、'A'
。默认为'A'
。subok
默认为False
ndmin
:指定结果ndarray
最少有多少个维度。
np.asarray(a[, dtype, order])
:将a
转换成一个ndarray
。其中a
是array_like
的对象, 可以是list
、list of tuple
、tuple
、tuple of list
、ndarray
类型。order
默认为C
。np.asanyarray(a[, dtype, order])
:将a
转换成ndarray
。np.ascontiguousarray(a[, dtype])
:返回C风格的连续ndarray
np.asmatrix(data[, dtype])
:返回matrix
np.copy(a[, order])
:返回ndarray
的一份深拷贝np.frombuffer(buffer[, dtype, count, offset])
:从输入数据中返回一维ndarray
。count
指定读取的数量,-1
表示全部读取;offset
指定从哪里开始读取,默认为0。创建的数组与buffer
共享内存。buffer
是一个提供了buffer
接口的对象(内置的bytes/bytearray/array.array
类型提供了该接口)。np.fromfile(file[, dtype, count, sep])
:从二进制文件或者文本文件中读取数据返回ndarray
。sep
:当从文本文件中读取时,数值之间的分隔字符串,如果sep
是空字符串则表示文件应该作为二进制文件读取;如果sep
为" "
表示可以匹配0个或者多个空白字符。np.fromfunction(function, shape, **kwargs)
:返回一个ndarray
。从函数中获取每一个坐标点的数据。假设shape
的维度为N,那么function
带有N
个参数,fn(x1,x2,...x_N)
,其返回值就是该坐标点的值。np.fromiter(iterable, dtype[, count])
:从可迭代对象中迭代获取数据创建一维ndarray
。np.fromstring(string[, dtype, count, sep])
:从字符串或者raw binary
中创建一维ndarray
。如果sep
为空字符串则string
将按照二进制数据解释(即每个字符作为ASCII
码值对待)。创建的数组有自己的数据存储区。np.loadtxt(fname[, dtype, comments, delimiter, ...])
:从文本文件中加载数据创建ndarray
,要求文本文件每一行都有相同数量的数值。comments
:指示注释行的起始字符,可以为单个字符或者字符列表(默认为#
)。delimiter
:指定数值之间的分隔字符串,默认为空白符。converters
:将指定列号(0,1,2...)的列数据执行转换,是一个map
,如{0:func1}
表示对第一列数据执行func1(val_0)
。skiprows
:指定跳过开头的多少行。usecols
:指定读取那些列(0表示第一列)。
2.3 从数值区间创建
np.arange([start,] stop[, step,][, dtype])
:返回均匀间隔的值组成的一维ndarray
。区间是半闭半开的[start,stop)
,其采样行为类似Python的range
函数。start
为开始点,stop
为终止点,step
为步长,默认为1。这几个数可以为整数可以为浮点数。注意如果step
为浮点数,则结果可能有误差,因为浮点数相等比较不准确。np.linspace(start, stop[, num, endpoint, ...])
:返回num
个均匀采样的数值组成的一维ndarray
(默认为50)。区间是闭区间[start,stop]
。endpoint
为布尔值,如果为真则表示stop
是最后采样的值(默认为True
),否则结果不包含stop
。retstep
如果为True
则返回结果包含采样步长step
,默认为True
。np.logspace(start, stop[, num, endpoint, base, ...])
:返回对数级别上均匀采样的数值组成的一维ndarray
。采样点开始于base^start
,结束于base^stop
。base
为对数的基,默认为 10。- 它逻辑上相当于先执行
arange
获取数组array
,然后再执行base^array[i]
获取采样点 - 它没有
retstep
关键字参数
- 它逻辑上相当于先执行
3. 数组的索引
3.1 一维数组的索引
一维数组的索引和列表相同。假设
a1
是一维数组可以指定一个整数
i
作为索引下标,如a1[i]
可以指定一个切片作为索引下标,如
a1[i:j]
。通过切片获得的新的数组是原始数组的一个视图,它与原始数组共享相同的一块数据存储空间。可以指定一个整数列表对数组进行存取,如
a1[[i1,i2,i3]]
。此时会将列表中的每个整数作为下标(i1/i2/i3
),使用列表作为下标得到的数组(为np.array([a1[i1],a1[i2],a1[i3]])
)不和原始数组共享数据。可以指定一个整数数组作为数组下标,如
a1[a2]
此时会得到一个形状和下标数组a2
相同的新数组。新数组的每个元素都是下标数组中对应位置的值作为下标从原始数组中获得的值。新数组不和原始数组共享数据。- 当下标数组是一维数组时,其结果和用列表作为下标的结果相同
- 当下标是多维数组时,结果也是多维数组
可以指定一个布尔数组作为数组下标,如
a1[b]
。此时将获得数组a1
中与数组b
中的True
对应的元素。新数组不和原始数组共享数据。- 布尔数组的形状与数组
a1
完全相同,它就是一个mask
- 布尔数组的形状与数组
xxxxxxxxxx- 如果是布尔列表,情况也相同 - 如果布尔数组的长度不够,则不够的部分作为`False`(该特性是`deprecating`,建议不要使用) ![index_bool](../imgs/ndarray/index_bool.JPG)
上述介绍的一维数组的索引,既可以用于数组元素的选取,也可以用于数组元素的赋值
你可以赋一个值,此时该值会填充被选取出来的每一个位置
你可以赋值一个数组或者列表,此时数组或者列表的形状要跟你选取出来的位置的形状完全匹配(否则报出警告)
- 数组不同于列表。对于列表,你无法对列表切片赋一个值,而是要赋一个形状相同的值
3.2 多维数组的索引
多维数组使用元组作为数组的下标,如
a[1,2]
,当然你也可以添加圆括号为a[(1,2)]
。- 元组中每个元素和数组的每个轴对应。下标元组的第 0 个元素与数组的第 0 轴对应,如第 1 个元素与数组的第 1 轴对应...
多维数组的下标必须是一个长度和数组的维度
ndim
相等的元组。- 如果下标元组的长度大于数组的维度
ndim
,则报错 - 如果下标元组的长度小于数组的维度
ndim
,则在元组的后面补:
,使得下标元组的长度等于数组维度ndim
。 - 如果下标对象不是元组,则
Numpy
会首先将其转换为元组。
下面的讨论都是基于下标元组的长度等于数组维度
ndim
的条件。- 如果下标元组的长度大于数组的维度
单独生成切片时,需要使用
slice(begin,end,step)
来创建。其参数分别为:开始值,结束值,间隔步长。如果某些参数需要省略,则使用None
。因此,a[2:,2]
等价于a[slice(2,None,None),2]
- 使用
python
内置的slice()
创建下标比较麻烦(首先构造切片,再构造下标元组),numpy
提供了一个numpy.s_
对象来帮助我们创建数组下标。s_
对象实际上是IndexExpression
类的一个对象
- 使用
多维数组的下标元组的元素可能为下列类型之一:整数、切片、整数数组、布尔数组。如果不是这些类型,如列表或者元组,则将其转换成整数数组。
多维数组的下标全部是整数或者切片:索引得到的是元素数组的一个视图。
多维数组的下标全部是整数数组:假设多维数组为 $ MathJax-Element-49 $ 。假设这些下标整数数组依次为 $ MathJax-Element-42 $ 。这 $ MathJax-Element-35 $ 个数组必须满足广播条件。假设它们进行广播之后的维度为 $ MathJax-Element-46 $ ,形状为 $ MathJax-Element-47 $ 即:广播之后有 $ MathJax-Element-46 $ 个轴:第 0 轴长度为 $ MathJax-Element-39 $ ,...,第 $ MathJax-Element-40 $ 轴长度为 $ MathJax-Element-41 $ 。假设 $ MathJax-Element-42 $ 经过广播之后分别为数组 $ MathJax-Element-43 $
则:索引的结果也是一个数组 $ MathJax-Element-45 $ ,结果数组 $ MathJax-Element-45 $ 的维度为 $ MathJax-Element-46 $ ,形状为 $ MathJax-Element-47 $ 。其中
$ R[i_0,i_1,\cdots,i_{M-1}]=\\ X[A^{\prime}_1[i_0,i_1,\cdots,i_{M-1}],A^{\prime}_2[i_0,i_1,\cdots,i_{M-1}],\cdots,A^{\prime}_n[i_0,i_1,\cdots,i_{M-1}]] $结果数组的下标并不来源于 $ MathJax-Element-49 $ ,而是来源于下标数组的广播之后的数组。相反,如果多维数组的下标为整数或者切片,则结果数组的下标来源于 $ MathJax-Element-49 $
多维数组的下标包含整数数组、切片:则切片/整数下标与整数数组下标分别处理。
多维数组的下标是布尔数组或者下标元组中包含了布尔数组,则相当于将布尔数组通过
nonzero
将布尔数组转换成一个整数数组的元组,然后使用整数数组进行下标运行。nonzero(a)
返回数组a
中,值非零的元素的下标。它返回值是一个长度为a.ndim
的元组,元组的每个元素都是一个一维的整数数组,其值为非零元素的下标在对应轴上的值。如:第 0 个元素为a
中的非零值元素在0
轴的下标、第 1 个元素为a
中的非零值元素在1
轴的下标,...
当下标使用整数或者切片时,所取得的数据在数据存储区域中是等间隔分布的。因为只需要修改数组的
ndim/shape/strides
等属性以及指向数据存储区域的data
指针就能够实现整数和切片下标的索引。所以新数组和原始数组能够共享数据存储区域。当使用整数数组(整数元组,整数列表页转换成整数数组),布尔数组时,不能保证所取得的数据在数据存储区中是等间隔的,因此无法和原始数组共享数据,只能对数据进行复制。
索引的下标元组中:
- 如果下标元组都是切片,则索引结果的数组与原始数组的维度相同(轴的数量相等)
- 每多一个整数下标,则索引结果的数组就少一个维度(少一个轴)
- 如果所有的下标都是整数,则索引结果的维度为 0
- 如果下标元组中存在数组,则还需要考虑该下标数组广播后的维度
通过索引获取的数组元素的类型为数组的
dtype
类型 。如果你想获取标准python
类型,可以使用数组的item()
方法。
3.3 索引的维度变换
对于数组,如果我们不考虑下标数组的情况,也就是:其下标仅仅为整数、或者切片,则有:
- 每次下标中出现一个整数下标,则索引结果的维度降 1。该维度被吸收掉
- 每次下标中出现一个切片下标,则该维度保持不变
前面提到:
多维数组的下标必须是一个长度和数组的维度 ndim 相等的元组
。但是如果下标中包含None
,则可以突破这一限制。每多一个None
,则索引结构维度升 1 。- 当数组的下标元组的长度小于等于数组的维度
ndim
时,元组中出现的None
等价于切片:
- 当数组的下标元组的长度大于数组的维度
ndim
时,元组中哪里出现None
,索引结果就在哪里创建一个新轴,该轴长度为 1。如c=a[0,:,None]
,索引结果的维度为(3,1)
;而d=a[0,None,:]
的索引结果维度为(1,3)
- 当数组的下标元组的长度小于等于数组的维度
4. 操作多维数组
numpy.concatenate((a1, a2, ...), axis=0)
:连接多个数组。其中(a1,a2,...)
为数组的序列,给出了待连接的数组,它们沿着axis
指定的轴连接。- 所有的这些数组的形状,除了
axis
轴之外都相同
- 所有的这些数组的形状,除了
numpy.vstack(tup)
:等价于numpy.concatenate((a1, a2, ...), axis=0)
。沿着 0 轴拼接数组- 沿0轴拼接(垂直拼接),增加行
numpy.hstack(tup)
:等价于numpy.concatenate((a1, a2, ...), axis=1)
。沿着 1 轴拼接数组- 沿1轴拼接(水平拼接),增加列
numpy.column_stack(tup)
:类似于hstack
,但是如果被拼接的数组是一维的,则将其形状修改为二维的(N,1)
。- 沿列方向拼接,增加列
numpy.c_
对象的[]
方法也可以用于按列连接数组。但是如果被拼接的数组是一维的,则将其形状修改为二维的(N,1)
。- 沿列方向拼接,增加列
numpy.split(ary, indices_or_sections, axis=0)
用于沿着指定的轴拆分数组ary
。indices_or_sections
指定了拆分点:- 如果为整数
N
,则表示平均拆分成N
份。如果不能平均拆分,则报错 - 如果为序列,则该序列指定了划分区间(无需指定最开始的
0
起点和终点)。如[1,3]
指定了区间:[0,1],[1,3],[3:]
而
numpy.array_split(ary, indices_or_sections, axis=0)
的作用也是类似。唯一的区别在于:当indices_or_sections
为整数,且无法平均拆分时,并不报错,而是尽可能的维持平均拆分。- 如果为整数
numpy.transpose(a, axes=None)
:重置轴序。如果axes=None
,则默认重置为逆序的轴序(如原来的shape=(1,2,3)
,逆序之后为(3,2,1)
)。如果axes!=None
,则要给出重置后的轴序。它获得的是原数组的视图。numpy.swapaxes(a, axis1, axis2)
:交换指定的两个轴axis1/axis2
。它获得是原数组的视图。
5.打印数组
当打印
ndarray
时,numpy
按照Python的嵌套list
的格式打印输出,但是按照以下顺序打印:- 最底层的
axis
按照从左到右的顺序输出 - 次底层的
axis
按照从上到下的顺序输出 - 其他层的
axis
也是按照从上到下的顺序输出,但是每个slice
中间间隔一条空行
如: 一维的
ndarray
按行打印;二维的ndarray
按照矩阵打印;三维的ndarray
按照矩阵的list
打印如果
ndarray
太大,那么numpy
默认跳过中间部分的数据而只是输出四个角落的数据。- 最底层的
要想任何时候都打印全部数据,可以在
print(array)
之前设置选项numpy.set_printoptions(threshold='nan')
。这样后续的打印ndarray
就不会省略中间数据。
6. Nan 和无穷大
在
numpy
中,有几个特殊的数:numpy.nan
表示NaN
(Not a Number
),它并不等价于numpy.inf
(无穷大)。numpy.inf
:正无穷numpy.PINF
:正无穷(它就引用的是numpy.inf
)numpy.NINF
:负无穷
有下列函数用于判断这几个特殊的数:
numpy.isnan(x[,out])
:返回x
是否是个NaN
,其中x
可以是标量,可以是数组numpy.isfinite(x[, out])
:返回x
是否是个有限大小的数,其中x
可以是标量,可以是数组numpy.isfinite(np.nan)
返回False
,因为NaN
首先就不是一个数
numpy.isposinf(x[, out])
:返回x
是否是个正无穷大的数,其中x
可以是标量,可以是数组numpy.isposinf(np.nan)
返回False
,因为NaN
首先就不是一个数
numpy.isneginf(x[, out])
:返回x
是否是个负无穷大的数,其中x
可以是标量,可以是数组numpy.isneginf(np.nan)
返回False
,因为NaN
首先就不是一个数
numpy.isinf(x[, out])
:返回x
是否是个无穷大的数,其中x
可以是标量,可以是数组numpy.isinf(np.nan)
返回False
,因为NaN
首先就不是一个数
下列函数用于对这几个特殊的数进行转换:
numpy.nan_to_num(x)
:将数组x
中的下列数字替换掉,返回替换掉之后的新数组:NaN
:替换为0- 正无穷:替换为一个非常大的数字
- 负无穷:替换为一个非常小的数字
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论