Numpy-我的学习笔记(全)

目录:

介绍

numpy是’Numerical Python’的简称,numpy提供了一个高性能的多维数组对象ndarray(N Dimension Array),以及大量的库函数和操作。

维度

图片

1)维度的写法

图片

2)元素的索引

图片

ndarray数据结构

1)元数据部分

存储当是当前ndarray对象当一些描述信息。比如shape\size\dtype\ndim

2)真实数据部分

存储的是当前这个ndarray对象中的真实数据

ndarray常用属性

ndim返回数组堆数

shape返回数组形状

dtype返回数组数据类型

size返回数组元素个数

itemsize返回数组每个元素占用空间大小(单位为字节)

nbytes返回数组所有元素占用空间大小(单位为字节)

图片

ndarray与list的区别

  1. list列表可以存储不同数据类型,而ndarray数据存储的所有元素类型,都必须一致
  2. 使用numpy创建数组的效率比原生list要高的多
  3. 使用ndarray创建数组的好处

1)每个元素类型一致,那么整个ndarray只需要一个元数据信息即可,而不是像list一样,每个对象都需要存储一个元数据信息

2)由于元数据只需要存储一份,所以更节省空间

3)每个元素类型一致,说明每个元素占用内存大小是一致的,存储数据可以更紧凑,效率更高

列表与数组之间的相互转换

  1. 列表转成数组,直接对列表应用np.array函数即可图片
  2. 数组转列表:tolist()图片

创建数组的不同方式

1、用np.array()函数去创建数组

  • np.array(参数)函数,参数给了什么样式的数据,就构建什么样式的ndarray数组;你给我一个一维列表,我就构建一个一维数组;你给我一个二维列表,我就构建一个二维数组;

  • 在numpy中,一维数组又叫做"向量";二维数组又叫做"矩阵";

2、利用np.arrange()函数去创建数组

对比range()函数

**相同点:**用法相同。都是(start,end,step)

不同点:np.arrnge()函数的步长可以是浮点数,但是range()函数的步长不能是浮点数

图片

3、利用指定值生成指定形状的数组

  • np.zeros((x,y)):生成一个x行y列的,元素都是0的二维数组;

  • np.ones((x,y)):生成一个x行y列的,元素都是1的二维数组;

  • np.full((x,y),value):生成一个x行y列的,元素都是value的二维数组,其中这个value值可以是整数(正整数,0,负整数)或者小数;

    图片

    Ps:传入一个数字,就可以创建一维数组;传入三个数字,就可以创建三维数组

4、按照已有的ndarray数组的形状,创建形状相同但指定元素的ndarray数组

先创建一个数组,再使用np.xx_like函数

图片

图片

常用的函数有:

  • np.zeros_like()

  • np.ones_like()

  • np.full_like()

5、创建单位矩阵和对角矩阵

1)单位矩阵
  • np.eye()或np.identity()

图片

2)对角矩阵
  • np.diag()

图片

6、创建等差数列数组

对比arrange()函数和linspace()函数学习
  1. np.arange(start,stop,step)第三个参数指的是元素步长;固定步数,和首位数

  2. np.linspace(start,stop,num)第三个参数指的是元素个数;固定首位数,个数。尾数可以不固定也可以固定

    图片

  3. np.linspace()中两个常用的参数:endpoint和dtype

    • endpoint=True表示是包含终止值(默认),endpoint=False表示不包含终止值;
    • dtype=np.float64指定创建的数组的数据类型默认是float64,你也可以设置为dtype=np.np.int32;

    图片

7、创建等比数列数组

图片

注意:上述代码表示在2的一次方到2的七次方之间,生成4个数,这四个数字还构成了一个等比数列。

图片

注意:上述代码表示会默认base=10,也就是说,在10的一次方到10的五次方之间,生成3个数,这3个数还构成一个等比数列。

8、通过自定义函数构建数组

(3,3)表示三行三列。第一行,第一列,坐标表示为(0,0),同理,第一行,第三列,坐标表示为(0,2)。

图片

Numpy中的常数

  • 正无穷:Inf = inf = infty = Infinity = PINF
  • 负无穷:NINF
  • 正零:PZERO
  • 负零:NZERO
  • 非数值:nan = NaN = NAN
  • 自然数e:e
  • π:pi
  • 伽马:euler_gamma
  • None:newaxis

图片

Numpy中的数据类型与数据类型转化dtype、astype

1、numpy中常用的数据类型

1byte=4bits 、 32bit=4 bytes、 64bit=8bytes、int32、 float64

2、使用astype()函数修改数组的数据类型:相当于创建新数组

图片

改变数组形状reshape

1、使用numpy中的reshape()函数修改数组对象

图片

2、使用数组对象的reshape()函数修改数组对象(这个更好用,因为直接在数组后面加reshape就行)

图片

3、改变数组形状时,如果维度大于1,可以将"最后一个维度"设置为-1

图片

数组维度扁平化:ravel()和flatten()函数

1、相同点

不管输入的数组是多少维,通过这两个函数,输出的都是一维数据

2、不同点

ravel()输出的是原数组的视图view;fltten()输出的是原数组的拷贝。修改视图会修改原函数,拷贝不会。

图片

切片

1、numpy中数组切片与原生python的列表切片的不同点

  • 后者返回的是原始数组的浅拷贝(修改列表中的不影响远列表元素)

  • 前者返回的是原始数组的视图view(修改视图也同时修改原数组)

2、使用copy数组方法

使用数组对象copy方法,可以实现底层数据的复制,而不是返回底层数据的视图view

图片

3、numpy中切片的使用

  • 使用切片需注意的点

图片

⚠️注:一张图体会数组切片。当step为负数时,索引必须也为负数,并且start数值要大于stop数值,不然会返回空的数组。

图片

图片

  • 当数组是多维数组时,可以使用array[高维,低维]的方式,按维度进行索引或切片

如果中括号[]中只写了一个维度的时候,就代表最高维;

对每一个维度,都可以使用上述的切片功能;

图片

  • 如何对二维数组对所有元素全部倒序过来?

在行后加-1,则对行倒序。在列后加-1,则对列倒序

图片

索引

1、普通索引

普通索引(不是把数组当作行、列的值),返回的是原数组的视图

图片

2、通过整数数组作为行列值进行索引

1)通过整数数组索引,获取数组中的元素

图片

2)提供多个一维数组索引,获取数组中的元素

图片

⚠️注:通过数组作为行列值索引返回的是原数组的拷贝,修改不影响原数组

3、用布尔值数组进行索引

含义:我们可以提供一个布尔类型的数组(A),然后通过该数组(A)来对另外一个数组(B)进行索引(元素选取)。索引的原则为:如果为True,则选取对应位置的元素,否则不选取。

  1. 布尔数组取一维数组中的元素

    图片

  2. 布尔数组取二维数组中的元素

    图片

  3. 构造布尔数组的几种常用运算符

图片

4、取出两个数组中相同的元素

图片

对应的位置,元素进行比较

数组的广播机制

1、概念

广播broacast是numpy对不同形状shape的数组进行数值计算的方式,对数组的算术运算通常在相对应的元素上进行。

⚠️注:不同形状的数组元素之间进行数值计算,会触发广播机制;同种形状的数组元素之间,直接是对应元素之间进行数值计算。

2、数组(与标量)之间的运算

1)先分别创建一维、二维、三维的数组

图片

2)数组与标量之间的运算结果

1)标量和一维、二维、三维数组之间的广播运算

图片结果表示:标量可以与任意维度数组运算,对应每个最低维度的元素元算。

2)一维与二维和三维度数组的运算

图片

b的行列可以表示为(1,2)

c的行列可以表示为 (3,2)

**结果表示:**一维数组只要列数和二维数组的列数相同即可进行运算。和三维数组也是,只要列数相同即可运算。

3)二维数组与三维数组的运算

图片

d的数组可以表示为 (2,2,2)#第一个2字是两个的意思,后面的2,2表示2行2列。即(2,2,2)表示两个2行2列的数组。

c的行列可以表示为 (3,2)

结果表示:由于c的行数为3,d的行数为2,即使列相等,由于行数不等,导致无法成功运算。所以二维与三维数组的运算,要满足行列数相等。

数组元素的底层存储与存储顺序说明

1、C语言风格

图片

当我们什么都不指定,直接创建了一个数组后,数据默认的填充方式是,先填满每一行,然后再填充第二行,依次进行下去。

原因是:numpy的底层是集成了C语言的,因此numpy数组元素的底层存储也就是“C风格”的,下面我们来对这种风格进行说明。

2、F语言风格

以二维数组来说,不管是C语言风格,还是F语言风格,他们在底层的存储顺序都是一行的,只不过最终呈现的效果属于“虚拟展示”。用两张图展示一下。

  • c语言风格

    图片

  • F语言风格

图片

PS:什么是C语言风格和F语言风格?

C指的就是C语言,numpy底层集成了C语言,因此当你不指定order参数的时候,默认就采用的是C语言风格,C语言风格,最右边的索引变化最快。

F指的就是F语言,最左边的索引变化最快。如下图展示:

图片

图片

3、例子

创建一个数组,分别使用不同的语言风格进行元素填充

  • 指定order=“C”(numpy默认就是order=“C”)

图片

  • 指定order=“F”

    图片

    说明:

图片

知识拓展补充

1、Axis轴的值

1)什么是维度?

图片

图片

2)axis=0与axis=1的含义

axis指的是‘轴’,轴的取值一般是0,1,2,…其中0表示最高维,1表示次高维,2表示次次高维,依次类推

当axis=0时候,拿二维数组举例,比如在a=arange(4).reshape(2,2).sum(axis=0) 表示对axis=0的轴(最高维)发生变化,对其他不变的元素进行求和运算。

同理,axis=1时候,表示对axis=1的轴(次高维)发生变化,但其他维度不变的元素 进行求和运算。

在三维数组中,还会有axis=2(最低维),表示对最低维发生变化,其他维度不变的元素进行函数运算。

2、案例说明

输入:

x = np.arange(8).reshape(2, 2, 2)
display(x)

display(x.sum(axis=0))
display(x.sum(axis=1))
display(x.sum(axis=2))

输出:

图片

结果分析:

图片

通过前面的叙述,我们已经知道axis=0表示最高维,axis=1表示次高维,依次下去。因此,对于三维数组来说,axis=0指的就是最高维(三维),axis=1指的就是次高维(二维),那么axis=2指的就是最低维(一维)。

  • - 当axis=0的时候,指的就是,最高维三维变化,其他维度不变化的数据会成为一组,因此x[0][0][0]、x[1][0][0];x[0][1][0]、x[1][1][0];x[0][0][1]、x[1][0][1];x[0][1][1]、x[1][1][1]各自成为一组,你把这组内对应元素相加就是x.sum(axis=0)的答案了。
      
    - 当axis=1的时候,就是次高维二维变化,其他维度不变化,因此x[0][0][0]、x[0][1][0];x[0][0]1]、x[0][1][1];x[1][0][0]、x[1][1][0];x[1][0][1]、x[1][1][1];各自成为一组,你把这组内对应元素相加就是x.sum(axis=1)的答案了。
    
      
    - 当axis=2的时候,最低维一维变化,其他维度不变化,因次x[0][0][0]、x[0][0][1];x[0][1][0]、x[0][1][1];x[1][0][0]、x[1][0][1];x[1][1][0]、x[1][1][1];各自成为一组,你把这组内对应元素相加就是x.sum(axis=2)的答案了
    

2021.4.21#完结 at xjtlu.CB building.
yokin

*参考内容:https://mp.weixin.qq.com/s/WQMzPkSaRS_L1j_5knp6yQ

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值