简介
本篇内容是上手NumPy的第二篇,NumPy这个词来源于两个单词-- Numerical和Python,所以两个要一起用才最好。后续内容将使用Python语言操作学习NumPy。
NumPy的数组
首先了解下NumPy数组的特性,数组是一个值网格,同一个数组内所有值的类型是相同的,并由非负整数元组索引。 维数是数组的排名; 数组的形状是一个整数元组,给出了每个维度的数组大小。
这里通过创建一个三维的数组来验证下特性,数组中值的类型是相同的,都是numpy.int32打印出数组的形状也是元组类型,通过该元组可以了解到数组的维度和每个维度的数量。可以通过非负整数索引找到某一个值,也可以修改索引对应的值。
上面是最常用的创建数组方法,当然也提供了特殊数组的创建方法,这里简单操作几种试一试,满足特殊使用。
上面三种数组的共同点是数组内的值是相同的,但是前面两种只需传入一个元组参数,元组内说明数组的维度和大小,但是不能规定数组的值。第三种比较自由些,更能指定值,根据不同需求可选择不同的函数使用。
上面三种函数创建的是可指定值的整数数组,下面再来试一试在0-1之间的随机小数组成数组,使用random.random()函数,效果如下。全都是小数点后有八位的小数,应该和该函数的源码参数有关,想要深入研究的小伙伴可以到仓库查看NumPy。
NumPy数组的切片
数组切片,这里的切片与Python列表类似,可以对numpy数组进行切片。由于数组可能是多维的,因此必须为数组的每个维指定一个切片。所以如果我们需要原数组中的一部分,可以通过切片的方法取得,例如想要将lc数组中的第一二行中的第二三列,那么操作可以如下,注意下标从0开始。
这里是切的二维数组,那么需要传入两个切片范围,在不指定开始范围时,默认是0,且不包括下标为2的行。如果我们仅需要某一行或者某一列,只需传入该行或列的下标。
这里的用法是将原数组中需要的值逐个索引出来,组成新的子数组。在传入索引值的时候,需要将所在行的值放在一个列表中,所在列的值放在另一个列表中,它在索引时会逐一配对,所以两个列表内元素数量要相同。得到子数组是一维的。
根据上面通过两个列表配置索引位置,再尝试创建一个有序的列表,然后另一个列表提前定义好,最后组合起来使用,也是可行的。
再接上面数组,用bool查找符合条件的值,符合为True,不符合为False。
数据类型:每个numpy数组都是相同类型元素的网格。Numpy提供了一组可用于构造数组的大量数值数据类型。Numpy在创建数组时尝试猜测数据类型,但构造数组的函数通常还包含一个可选参数来显式指定数据类型。
NumPy数组的计算
继续尝试下数组和数组之间的计算,基本数学函数在数组上以元素方式运行,既可以作为运算符重载,也可以作为numpy模块中的函数。打印出来的效果是一致的。
在上篇内容中介绍的dot()函数是以矩阵为单位计算的。这里的加减乘除运算是以元素为单体的计算,而不是矩阵之间的计算。
这里还遇到一个小疑问,在操作数组进行开平方的时候,传入了两个数组x和y,但是只得到一个数组x的计算结果,当把参数位置调换后y和x,得到的结果却不是y的开方结果。
还请了解原因的同学不吝赐教。
当然除了使用数组计算数学函数外,我们经常需要对数组中的数据进行整形或其他操作。这种操作的最简单的例子是转置一个矩阵;要转置一个矩阵,只需使用一个数组对象的T属性。
非常的简单易懂,通过使用得知,转置对一维的数组没有效果。在对二或者更多维数组进行转置的时候是有效的,转置的规则也不难发现,将会对需要转置的原数组从最外层开始,然后依次组成新数组的每一行。
广播机制:它允许numpy在执行算术运算时使用不同形状的数组。通常,我们有一个较小的数组和一个较大的数组,我们希望多次使用较小的数组来对较大的数组执行一些操作。
比如如何让一个3×3的数组第一列值加3,第二列值加2,第三列值加1。
- 第一种方法:再创建一个3×3的数组第一列值为3,第二列值为2,第三列值为1,然后两个数组相加,这是最直接有效的办法,但是如果数组每一维很大,就会很麻烦。
【MindSpore易点通】数据处理之Numpy数组的使用
数据结构
Numpy
发表于 2022-02-23 16:23:471016查看
简介
本篇内容是上手NumPy的第二篇,NumPy这个词来源于两个单词-- Numerical和Python,所以两个要一起用才最好。后续内容将使用Python语言操作学习NumPy。
NumPy的数组
首先了解下NumPy数组的特性,数组是一个值网格,同一个数组内所有值的类型是相同的,并由非负整数元组索引。 维数是数组的排名; 数组的形状是一个整数元组,给出了每个维度的数组大小。
这里通过创建一个三维的数组来验证下特性,数组中值的类型是相同的,都是numpy.int32打印出数组的形状也是元组类型,通过该元组可以了解到数组的维度和每个维度的数量。可以通过非负整数索引找到某一个值,也可以修改索引对应的值。
上面是最常用的创建数组方法,当然也提供了特殊数组的创建方法,这里简单操作几种试一试,满足特殊使用。
上面三种数组的共同点是数组内的值是相同的,但是前面两种只需传入一个元组参数,元组内说明数组的维度和大小,但是不能规定数组的值。第三种比较自由些,更能指定值,根据不同需求可选择不同的函数使用。
上面三种函数创建的是可指定值的整数数组,下面再来试一试在0-1之间的随机小数组成数组,使用random.random()函数,效果如下。全都是小数点后有八位的小数,应该和该函数的源码参数有关,想要深入研究的小伙伴可以到仓库查看NumPy。
NumPy数组的切片
数组切片,这里的切片与Python列表类似,可以对numpy数组进行切片。由于数组可能是多维的,因此必须为数组的每个维指定一个切片。所以如果我们需要原数组中的一部分,可以通过切片的方法取得,例如想要将lc数组中的第一二行中的第二三列,那么操作可以如下,注意下标从0开始。
这里是切的二维数组,那么需要传入两个切片范围,在不指定开始范围时,默认是0,且不包括下标为2的行。如果我们仅需要某一行或者某一列,只需传入该行或列的下标。
这里的用法是将原数组中需要的值逐个索引出来,组成新的子数组。在传入索引值的时候,需要将所在行的值放在一个列表中,所在列的值放在另一个列表中,它在索引时会逐一配对,所以两个列表内元素数量要相同。得到子数组是一维的。
根据上面通过两个列表配置索引位置,再尝试创建一个有序的列表,然后另一个列表提前定义好,最后组合起来使用,也是可行的。
再接上面数组,用bool查找符合条件的值,符合为True,不符合为False。
数据类型:每个numpy数组都是相同类型元素的网格。Numpy提供了一组可用于构造数组的大量数值数据类型。Numpy在创建数组时尝试猜测数据类型,但构造数组的函数通常还包含一个可选参数来显式指定数据类型。
NumPy数组的计算
继续尝试下数组和数组之间的计算,基本数学函数在数组上以元素方式运行,既可以作为运算符重载,也可以作为numpy模块中的函数。打印出来的效果是一致的。
在上篇内容中介绍的dot()函数是以矩阵为单位计算的。这里的加减乘除运算是以元素为单体的计算,而不是矩阵之间的计算。
这里还遇到一个小疑问,在操作数组进行开平方的时候,传入了两个数组x和y,但是只得到一个数组x的计算结果,当把参数位置调换后y和x,得到的结果却不是y的开方结果。
还请了解原因的同学不吝赐教。
当然除了使用数组计算数学函数外,我们经常需要对数组中的数据进行整形或其他操作。这种操作的最简单的例子是转置一个矩阵;要转置一个矩阵,只需使用一个数组对象的T属性。
非常的简单易懂,通过使用得知,转置对一维的数组没有效果。在对二或者更多维数组进行转置的时候是有效的,转置的规则也不难发现,将会对需要转置的原数组从最外层开始,然后依次组成新数组的每一行。
广播机制:它允许numpy在执行算术运算时使用不同形状的数组。通常,我们有一个较小的数组和一个较大的数组,我们希望多次使用较小的数组来对较大的数组执行一些操作。
比如如何让一个3×3的数组第一列值加3,第二列值加2,第三列值加1。
- 第一种方法:再创建一个3×3的数组第一列值为3,第二列值为2,第三列值为1,然后两个数组相加,这是最直接有效的办法,但是如果数组每一维很大,就会很麻烦。
- 第二种方法:Numpy广播允许我们在不创建很繁琐的v的情况下执行此计算。考虑这个需求,使用广播。
总结
本次内容主要对NumP的数组进行了比较详细的使用和介绍,使用中包括数组的特性、索引、切片以及一些特殊运算。介绍的内容是使用NumPy计算时原理的解释。欢迎各位同学留言讨论~
这样也可以得到想要的结果。y=x+v行即使x具有形状(3,3)和v具有形状(3, ),但由于广播的关系,该行的工作方式就好像v实际上具有形状(3,3),其中每一行都是v的副本,并且求和是按元素执行的。所以广播机制的使用会让效率更高,代码更简洁。