Numpy图解

Numpy图解,第1张

目录

矩阵

矩阵初始化

axis参数

矩阵运算

运算符+,-,*,/,//,**和@

转置和reshape

连接矩阵hstack和vstack

分裂矩阵hsplit和vsplit

复制矩阵tile和repeat

删除行列delete

插入行列insert

添加 *** 作append和pad

Meshgrid

矩阵统计

矩阵排序

矩阵 矩阵初始化

矩阵初始化语法与向量相似:

这里需要双括号,因为第二个位置参数是为dtype保留的。

随机矩阵的生成也类似于向量的生成:

二维索引语法比嵌套列表更方便:

和一维数组一样,上图的view表示,切片数组实际上并未进行任何复制。修改数组后,更改也将反映在切片中。

axis参数

在许多 *** 作(例如求和)中,我们需要告诉NumPy是否要跨行或跨列进行 *** 作。为了使用任意维数的通用表示法,NumPy引入了axis的概念:axis参数实际上是所讨论索引的数量:第一个索引是axis=0,第二个索引是axis=1,等等。

因此在二维数组中,如果axis=0是按列,那么axis=1就是按行。

矩阵运算 运算符+,-,*,/,//,**和@

普通的运算符(如+,-,*,/,//和**)以元素方式计算外,还有一个@运算符可计算矩阵乘积:

在第一部分中,我们已经看到向量乘积的运算,NumPy允许向量和矩阵之间,甚至两个向量之间进行元素的混合运算:

转置和reshape

从上面的示例可以看出,在二维数组中,行向量和列向量被不同地对待。

默认情况下,一维数组在二维 *** 作中被视为行向量。因此,将矩阵乘以行向量时,可以使用(n,)或(1,n),结果将相同。

如果需要列向量,则有转置方法对其进行 *** 作:

从一维数组中生成二位数组列向量的两个 *** 作是使用命令reshape重排和newaxis建立新索引:

这里的-1参数表示reshape自动计算第二个维度上的数组长度,None在方括号中充当np.newaxis的快捷方式,该快捷方式在指定位置添加了一个空axis。

因此,NumPy中总共有三种类型的向量:一维数组,二维行向量和二维列向量。这是两者之间显式转换的示意图:

根据规则,一维数组被隐式解释为二维行向量,因此通常不必在这两个数组之间进行转换,相应区域用灰色标出。

连接矩阵hstack和vstack

连接矩阵有两个主要函数:

这两个函数只堆叠矩阵或只堆叠向量时,都可以正常工作。但是当涉及一维数组与矩阵之间的混合堆叠时,vstack可以正常工作:hstack会出现尺寸不匹配错误。

因为如上所述,一维数组被解释为行向量,而不是列向量。解决方法是将其转换为列向量,或者使用column_stack自动执行:

分裂矩阵hsplit和vsplit

堆叠的逆向 *** 作是分裂:

复制矩阵tile和repeat

矩阵可以通过两种方式完成复制:tile类似于复制粘贴,repeat类似于分页打印。

删除行列delete

特定的列和行可以用delete进行删除:

插入行列insert

逆运算为插入:

添加 *** 作append和pad

append就像hstack一样,该函数无法自动转置一维数组,因此再次需要对向量进行转置或添加长度,或者使用column_stack代替:

实际上,如果我们需要做的就是向数组的边界添加常量值,那么pad函数就足够了:

Meshgrid

如果我们要创建以下矩阵:

两种方法都很慢,因为它们使用的是Python循环。在MATLAB处理这类问题的方法是创建一个meshgrid:

该meshgrid函数接受任意一组索引,mgrid仅是切片,indices只能生成完整的索引范围。fromfunction如上所述,仅使用I和J参数一次调用提供的函数。

但是实际上,在NumPy中有一种更好的方法。无需在整个矩阵上耗费存储空间。仅存储大小正确的矢量就足够了,运算规则将处理其余的内容:

在没有indexing=’ij’参数的情况下,meshgrid将更改参数的顺序:J, I= np.meshgrid(j, i)—这是一种“ xy”模式,用于可视化3D图。

除了在二维或三维数组上初始化外,meshgrid还可以用于索引数组:

矩阵统计

就像之前提到的统计函数一样,二维数组接受到axis参数后,会采取相应的统计运算:

二维及更高维度中,argmin和argmax函数返回最大最小值的索引:

all和any两个函数也能使用axis参数:

矩阵排序

尽管axis参数对上面列出的函数很有用,但对二维排序却没有帮助:

axis绝不是Python列表key参数的替代。不过NumPy具有多个函数,允许按列进行排序:

1、按第一列对数组排序:a[a[:,0].argsort()]

argsort排序后,此处返回原始数组的索引数组。

此技巧可以重复,但是必须小心,以免下一个排序混淆前一个排序的结果:

a = a[a[:,2].argsort()]a = a[a[:,1].argsort(kind=’stable’)]a = a[a[:,0].argsort(kind=’stable’)]

2、有一个辅助函数lexsort,该函数按上述方式对所有可用列进行排序,但始终按行执行,例如:

  • a[np.lexsort(np.flipud(a[2,5].T))]:先通过第2列排序,再通过第5列排序;

  • a[np.lexsort(np.flipud(a.T))]:按从左到右所有列依次进行排序。

3、还有一个参数order,但是如果从普通(非结构化)数组开始,则既不快速也不容易使用。

4、因为这个特殊的 *** 作方式更具可读性和它可能是一个更好的选择,这样做的pandas不易出错:

  • pd.DataFrame(a).sort_values(by=[2,5]).to_numpy():通过第2列再通过第5列进行排序。

  • pd.DataFrame(a).sort_values().to_numpy():通过从左向右所有列进行排序

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/724453.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存