首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

NumPy高效使用逻辑,11个角度理顺它!

此文是我的第324原创

1 Numpy更高效

使用Python的地方,就能看到Numpy,尤其是需要数值计算的地方,Numpy的高性能更是体现的淋漓尽致。

它基于Python,提供远高于Python的高性能向量、矩阵和更高维度的数据结构。之所以性能高是由于它在密集型计算任务中,向量化操作是用C和Fortran代码实现。

2 导入Numpy

只需要一行代码就能导入:

在numpy包中,描述向量,矩阵和更高维度的数据集使用的术语是.

3 生成numpy数组

有许多方法能初始化一个新的numpy数组,例如:, 等,从文件中读入数据,从python的lists等都能生成新的向量和矩阵数组。例:

v和m的类型都是ndarray,这是numpy中最主要的数据结构之一

v和m的不同仅仅是它们的形状(shape), 我们能通过ndarray.shape属性发现它们的形状信息,shape属性很有用,尤其在深度学习模型调试中:

numpy中获取元素个数通过size:

4 为什么要用numpy?

到此,看起来非常像Python的list, 那我们为什么不用Python的list计算,干嘛非要创造一个新的数组(array)类型呢?

有多个原因:

Python的list是一个通用结构。Python的list能包括任意类型的对象,并且是动态类型, 它们不支持一些数学函数,比如矩阵的点乘,实现如此的函数对于Python的list而言,不会高效,因为它是动态类型

Numpy的array是静态类型和同质的,当array被创建时,元素的类型就确定

Numpy的array更节省内存

由于是静态类型,一些数学函数实现起来会更快,例如array间的加减乘除能够用C和Fortran实现

使用ndarray.dtype, 我们能看到一个数组内元素的类型:

如果我们尝试用str类型赋值给m,会报错:

创建数组时,能指定类型,通过为dtype赋值:

dtype更多取值:, , , , , 我们还可以显示的定义数据位数的类型,如:, , ,

5 通过函数生成数组

对于更大的数组,手动初始化数据是不现实的,比如使用python的list. 我们得用numpy提供的函数才能生成不同形式的数组。比如更通用的:

函数:起始点,终点,步长;不包括终点

函数:起始点,终点,分割份数;包括终点

函数:如下例子,各项分别为 e^1,e^2, e^3,…e^10

函数,实际工作中也很有用,在这里我列举一个

这是基本用法,完全看不出干啥。如果我有10个点,想要得出这10个点的两两间距离:

特殊点的矩阵,对角阵:

主对角线偏移1的矩阵:

零阵:

1阵:

6 随机函数

Numpy提供的使用起来更友好,如下:

获得取值(0,1)上的均匀分布,生成shape为(1,2,3)的三维数组:

满足均值为0,方差为1的高斯分布得到随机数据,生成shape为(5,)的一维数组:

7 主要属性

生成1个三维数组:

每个元素的字节数:

M的总字节数:

M的维数:

8 索引数组

索引数组的元素,可以使用方括号和下标,M是三维,下标索引的方法:

使用 表示全部此维度的所有元素都要获取:

也可方便的切片:

直接赋值:

更有用的掩码索引,对应一个bool类型的数组:

M的维数:,结果维度预期:,但是实际结果维度:

掩码索引,这一特性对于带条件的选取元素很重要。例如,使用生成一维数组x:

判断x 中哪些元素大于5 呢

结果返回的一堆:True, False:

然而有时候,我们想知道x 中哪些位置的元素大于5,此时要借助 :

9 元素级操作

NumPy中两个数组加减乘除等,默认都是对应元素的操作:

v1+2:

v1 * v1:

10 矩阵运算

线性代数中,矩阵的相乘操作在NumPy 中怎么实现,两种方法: 和 。

操作:

另一种方法包装为:

经过包装后,shape取值也会变得更符合线代中的常识:

而在没有包装前:

求矩阵的行列式,要求数组的最后两个维度相等,因此重新构造一个矩阵:

11 统计变量

求平均值:

求标准差:

求方差:

求最大值:

求最小值:

求和:

求累乘:

求累和:

求迹:

12 改变Shape

NumPy数组的shape 被修改而无需复制原有数据,这使它更为高效。

我们验证下v4 是否真的没有被复制:

所以验证得出:v4仅仅是v3的视图,未发生复制。

NumPy 提供的 函数也有改变shape 的能力,将高维数组变为向量。但是,

有时,我们需要增加维度,此时可使用,它会插入1个维度,如下在第三个维度插入,v5的shape变为: [3,3,1]

13 数组由小变大

NumPy中的函数 , , , , 和 具备变换小数组为大数组的能力。

复制元素

复制块:

竖直方向合并数组:

水平方向合并数组:

指定在哪个轴向上合作数组:

以上全部手码,利用两个周的课余时间整理出来,从十几个角度汇总NumPy平时经常使用的函数,希望对大家有用。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20191117A0GXZP00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券