目录
矩阵初始化
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和padappend就像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():通过从左向右所有列进行排序
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)