导图社区 numpy
目前来看,本思维导图是全站最基础,最明晰的numpy的脑图,结构清晰,欢迎交流学习!
编辑于2021-12-27 09:26:46numpy
由于python的数据类型在保存的时候,不仅仅是保存数据值,还保存的数据的类型。每一个变量在python逻辑里,相当于一个指针,指向的是数据存储的内存位置,这个内存位置包含了数据的类型、值等基本信息。这样做在定义数据的时候很容易,但是在计算的时候,由于python需要不断的比较数据类型,就降低了程序的运算速度。 nunpy出现的思路很简单,就是将一些数据类型相同的数据放在一个array里,这样就省掉了比较数据类型的步骤以加快计算速度。并且针对python对数据集操作必须使用循环的弱点,又为array定义了简单直接的计算,操作,索引方式。
基础知识
array数组的基本参数
有关array的参数
shape
数组的形状,即几行几列
ndim
数组的维度,平时说的几维数组
size
数组的大小,数据里面有多少个数据,理论上,他是shape里面所有数据的乘积
有关array数据的参数
dtype
数据类型,对于array这种固定数据类型的数据结构,这个参数就显得无比重要
itemsize
每个数据的大小(字节大小)
bytes
数组所占的字节总大小
array的生成方式
直接生成法
直接指定数组
生成带有某种规律的array
以某个值填充数组
np.zeros
np.ones
np.full
需要指定shape(无需写出shape),dtype可指定可不指定,对于full函数,需要指定要填充的数
随机生成数组
np.arange
类似range函数
np.linspace
生成均匀分布的数
需要设置三个变量,对于arange需要设置起始值,结束值,步长值(可设置可不设置);对于linespace需要设置起始值,步长值,要生成的数的总数(不是shape)
np.random.random
随机生成数
np.random.randint
随机生成整数数组
np.random.normal
按照正态分布生成数
需要设置shape,对于normal需要设置均值与方差,对于randint函数还可以随机设置开始与起始值,无法传递shape,但是可以对于randint可以通过size传递shape
还可以用seed,randomstate使每次生成的数组固定:np.random.seed(),np.random.randomstate()
线性代数数组
np.eye
生成单位矩阵
np.empty
初始化一个矩阵,可以任意给这个array赋值,且之后这个array的值就不再变
array的类型
按照维数(ndim)分
一维数组
二维数组(矩阵)
多维数组
按照dtype分(常用)
数值型数组
布尔(bool)型数组
结构化数组
允许数组里面存在多个类型的值
生成结构化数组的方法
利用字典定义dtype(在定义数组时候)
data = np.zeros(4,dype={'names:('name','age','weight') 'formats':('U10','14','f8')}) 并且dtype的类型可以是python的方法,也可以是array的方法
也可以使用np.dtype直接定义,这样做比较简明
元组列表 [(变量的名称,变量的类型),(name,format),(name,format)]
当名字不重要时,可以省略name
不同shape数组的复合
将数组的类型定为'mat','mat'类型的数组需要传递数组的shape
'mat'类型的数组
记录数组
允许使用按键来代替字典的引用
recarray
array的索引
用[]
获取单个值
索引单个值[]
索引值是从0开始的
获取子数组
切片[:]
返回的是数组的视图,不是数组的副本,当对切片进行修改的同时,原array也会发生相应的改变 若想创建数组的副本,则需要用.copy()方法
[:]形式只是根据维数来说的,[:,:,:],即可以对不同的维度采用切片
一个冒号代表空切片,代表这一维度全部索引,因此可以使用空切片获取数组的某行或者某列(在获取行时,可省略空切片)
使用布尔掩码
传递一个关系表达式,即传递一个布尔掩码,返回的是一个值为True的数组
花哨索引
即传递一个列表或者数组,进行索引 利用花哨索引可以实现很多有趣的事情,对于多维数组,当分别传递一个列向量和一个行向量时,可以返回一个同维度数组 例如: import numpy as np x=np.arange(12).reshape((3,4)) row=np.array([0,1,2]) col=np.array([2,1,3]) x[row[:,np.newaxis],col]
不要把这些索引方式孤立起来,组合灵活使用,会有很多强大的索引方式
array的计算
首先,先理解通用函数这两个字的含义,以及为什么要用通用函数进行数组的计算: 通用,意思是这些函数的形式来源与python底层函数一样(即便可以使用array函数进行定义) 对数组进行通用函数的操作,相当于对数组的每一个值进行相同的操作,从而避免了使用循坏,这也是array高效的原因 又称向量操作,这种操作特点之一是特别灵活,灵活的原因之一是因为它的广播逻辑 可以分为一元通用函数与二元通用函数,一元通用函数即对一个array进行操作,二元是指两个array
数值型数组的运算
通用函数
一些初等运算
+ 对应 np.add
- 对应 np.substract
-取相反数 对应 np.negative
* 对应 np.multiply
/ 对应 np.divide
// 对应 np.floor_divide
** 对应 np.power
% 对应 np.mod
每一个array的通用运算符都对应着python的一个底层运算符,但是使用array的通用运算符有助于使用通用运算符的函数特性:指定输出,聚合等
通用函数的特性
指定输出
通过指定out实现,可以将通用函数的结果赋给一个变量
再结合索引等操作,可以实现插入计算值等操作,但需要注意的是,out输出的数组需要提前定义
聚合
这里的聚合指的是通用函数的特性,并不是数组的聚合运算 这里的聚合相当于得到一个数,操作的对象直接是数据
reduce
得出一个总聚合值
accumulate
将聚合历史显示出来
外积
outer
可以对一个数组的一个值对另外一个数组的所有值进行运算
聚合运算(函数)
其主要目的是为了算出数组的某些概括统计值
类型
多维数组的多维度聚合-设置axis实参
axis=0,对列进行操作
axis=1,对行进行操作
得到一个行向量,这些操作基于矩阵
广播准则(运算)
使用场景
二元通用函数
意义
提高数组计算的灵活性,在进行数组运算的时候,并不要求维度完全一致
广播规则
至少有一个维数相等或者一个维数为1
bool数组的运算
通用函数
与数值型数组的通用函数一样,可以使用python的底层代码,也可以使用array代码
== 对应 np.equal
!= 对应 np.notequal
< 对应 less
<= 对应 np.less_equal
> 对应 np.greater
>= 对应 np.greater_equal
聚合函数
同普通数组一样,不过需要注意的是,设计求和等计算的时候,True为1,False为0 也可以使用一些向行聚合,向列聚合的多维聚合命令
bool运算
逐位运算符,他对每一个元素进行操作,而不是数组的操作,因此不适应用python的and或者or
和&
或|
非~
^
操作array
数组的变形
np.reshape方法
将一个一维数组转为一个二维数组的行或者列
np.newaxis方法
数组的拼接与分裂
array的拼接
np.concatence
axis=0,沿着第一个轴拼接,也可省略axis=0
如果是矩阵的话,是按照列拼接,折叠第一个轴,行增多
axis=1,沿着第二个轴拼接
如果是矩阵,则按照行拼接(列增多)
np.vstack
垂直栈,按照行拼接
np.hstack
数值栈,按照列拼接
array的分裂
split
vsplit
垂直分裂
hsplit
水平分裂
需要传递两个实参,一个是列表,另一个是分裂点的列表
array的排序
排序方法是快速排序
全排序
直接排序
不想替换原来的数组
np.sort(<array>)
替换原来的数组
<array>.sort()
多维数组的按照行与列排序
axis=0,每一列进行排序
axis=1,每一行进行排序
按照索引排序
先用np.argsort函数生成索引值 在用花哨索引(索引列表)进行排序
np.argsort()
模糊排序
只会分出某一些最小的值和其他值,并不会严格按照顺序进行排序,只是分成两块,一块大值,一块小值。
np.partition()
需传递两个实参,一个要排序的列表,一个要挑出来的小值个数
bool数组的操作