知识点1:
- 列表、集合、数组类型表示数据
- 列表中每一个数据的数据类型可以存在不同。数组要求每一个元素的类型是相同的
- 二维数据是一维数据组合形式
- 表格是典型的二维数据
- 高维数据是通过最基本的二元关系表示数据间的复杂结构
知识点2:
6. 一维数据可以使用列表(有序)和集合类型(无序)
-
二维和多维数据用列表类型(多维列表代表多维数据)
-
高维数据用字典或者数据表示格式:
dict={ "A"="aa" }
-
表示n维数组对象:ndarray
-
线性代数、傅里叶变换、随机数生成
-
引用:import numpy as np
-
例子:计算 A 2 + B 3 A^2+B^3 A2+B3,其中 A A A和 B B B是一维数组
#普通写法 def pysum(): a=[0,1,2,3,4] b=[9,8,7,6,5] c=[] for i in range(len(a)): c.append(a[i]**2+b[i]**3) return c print(pysum())#使用numpy计算 import numpy as np def npsum(): a=np.array([0,1,2,3,4]) b=np.array([9,8,7,6,5]) c=a**2+b**3 return c print(npsum())- 提供数组对象提高计算速度(底层C语言)
- 科学计算中,一个维度所有的数据的数据类型往往是相同的。(数组对象采用相同的数据类型更好)
- ndarray是一个多维数组对象,包括实际的数据和描述这些数据的元数据(维度、类型等)。要求类型相同,下标从0开始。
- np.array()输出为[],元素由空格分开。
- 轴(维度)和秩(.ndim)(维度的数量)、ndarray对象的尺度(.shape)(如矩阵,n行m列)、元素个数(.size)(如上述n*m)、ndarray对象的元素类型(.dtype)、ndarray对象中每个元素的大小(.itemsize)(以字节为单位,方便计算ndarray占用的内存空间)
a=np.array([[0,1,2,3,4], [9,8,7,6,5]]) a.ndim >2 #代表有两维 a.shape >(2,5) #代表是2行5列 a.dtype >'int 32' #是ndarray自定义的类型 a.itemsize >4- python仅支持整数、浮点数和复数三种类型。
- ndarray也可以由非同质对象构成,非同质ndarray认为每一个不同类型的元素都是一个对象,都是对象类型‘o’,无法发挥使用numpy优势,需要避免使用。(同质即本质相同,非同质则不同,此处应该指的是类型不同)。
- 从python的列表、元组。
#从列表或者元组创建ndarray(列表是[],元组是(),列表可以更改而元组不可更改) x=np.array(list/tuple) #用dtype指定元素类型 x=np.array(list/tuple,dtype=np.float32) #不指定dtype时会自动根据数据创建相关度最高的类型定义
- 从numpy中的函数创建。(如arange、ones、zeros等)
np.arange(n) #返回ndarray类型,元素从0到n-1(不指定为整数类型) np.ones(shape) #根据shape生成一个全1数组,shape为元组类型。eg:生成一个两行三列的数组,shape:(2,3),(不指定为浮点数类型),shape从左到右是最外层到最内层的。 np.zeros(shape) #同理,(不指定为浮点数类型) np.full(shape,val) #根据shape生成一个数组,每个值都是val,(不指定为浮点数类型) np.eye(n) #创建一个n*n的矩阵,对角线为1,其余均为0(正定矩阵),(不指定为浮点数类型) np.ones_like(a) #根据数组a的形状生成全1数组 np.zeros_like(a) np.full_like(a,val) #同理 np.linspace() #eg: a=np.linspace(1,10,4)//1代表起始位置,第二个参数是最后一个元素的值,4代表共有四个元素。 >a=([1.,4.,7.,10.]) b=np.linspace(1,10,4,endpoint=False)//置为False时不作为最后一个值出现。 >b=([1.,3.25,5.5,7.75]) np.concatenate() #将两个或者多个数组合并为新的数组- 从字节流(raw bytes)中创建。
- 从文件中读取特定的格式,创建ndarray数组。
- 创建后的ndarray数组可以进行维度和元素变换
a.reshape(shape) #不改变数组元素,返回一个shape形状的数组,原数组不变。 a.resize(shape) #和reshape一致,但是是直接修改原数组 a.swapaxes(ax1,ax2) #将数组中n个维度中两个维度进行调换 a.flatten #对数组进行降维,返回折叠后的一维数组,而原数组不变。 new_a=a.astype(new_type) #返回一个新的数组 b=a.tolist() #从数组转换为列表 #由于列表是最原始的数据类型,比numpy慢很多,但是适合于原生程序计算。
#eg: a=np.ones((2,3,4),dtype=np.int32) #不写32也可以,会自动判断是int64还是int32 a.reshape((3,8)) #需要保证两边总数一样,如3*8=2*3*4 b=a.astype(np.float)#float同理 >b #会生成一个浮点型的数组 #这里astype一定会生成一个新的数组(原来版本的copy)
数组的索引和切片-
索引是获取数组中特定位置元素的过程
a=np.array([9,8,7,6,5]) #索引,从0开始 a[2]
-
切片是获取数组中元素子集的过程(在数组中找到一组数据)
a=np.array([9,8,7,6,5]) a[1:4:2] #第一个元素为开始的编号,第二个为终止的编号(索引中无终止编号),第三个元素为步长,即从1到4步长为2的元素,如1、3,对应为8、6,此命令得到的切片为[8,6]
-
多维数组的索引:
a=np.arange(24).reshape((2,3,4)) #生成一个维度为(2,3,4),从0开始到23的一个数组 a >([[[0,1,2,3], [4,5,6,7], [8,9,10,11]], [[12,13,14,15], [16,17,18,19], [20,21,22,23]]]) a[1,2,3] >23 a[-1,-2,-3] >17 #-1表示数组最后一个元素值,-2表示倒数第二个,-3表示倒数第三个
-
多维数组的切片:
a[:,1,-3] >[5,17] #选取一个维度用:,此处表示不论维度是哪一个(即第一个维度都要),然后取满足第二个维度的1和第三个维度的-3的那个值(有几个第一维就有几个值)。 a[:,1:3,:] >{[[4,5,6,7],[8,9,10,11]],[[16,17,18,19],[20,21,22,23]]} #第一个和第三个个维度遍历,取第二个维度的1~3个。 a[:,:,::2] >[[[0,2], [4,6], [8,10]], [[12,14], [16,18], [20,22]]] #通过步长进行切片,从第一个元素开始算起数组的运算- 数组与标量之间的运算:数组中每一个元素都要与标量进行计算。
#此处a与前同: a.mean() >11.5 #取均值使其变成标量 a=a/a.mean() a >三层数组 #每一个值都除了
- 数组的计算公式:
#这里x为数组。且运算时数组本身不发生变化,而是copy了一个运算版本。 np.abs(x)、np.fabs(x) #计算数组各元素的绝对值 np.sqrt(x) #计算数组各元素的平方根 np.square(x) #计算数组各元素的平方 np.log(x)、np.log10(x)、np.log2(x) #计算数组各元素的自然对数、以10为底的对数和2为底的对数 np.ceil(x)、np.floor(x) #计算数组各元素的ceiling(不超过元素的整数值)值或floor(小于这个元素的最大整数值)值 np.rint(x) #计算数组的各元素的四舍五入值 np.modf(x) #将数组各元素的小数和整数部分以两个独立数组形式返回 np.cos(x)、np.cosh(x)、np.sin(x)、np.sinh(x)、np.tan(x)、np.tanh(x) #计算数组各元素的普通和双曲三角函数 np.exp(x) #计算数组的各元素的指数值 np.sign(x) #计算数组各元素的符号值,即当值为正数时返回1,负数返回-1,0即返回0。
3.numpy的二元函数:
+、-、*、/、** #加、减、乘、除、乘方(均是两个数组各元素对应运算) np.maximum(x,y)、np.fmax() #返回元素的最大值(本质是一个运算,当数据类型不同的时候会生成浮点数) np.minimum(x,y)、np.fmin() #返回元素的最小值(本质是一个运算,当数据类型不同的时候会生成浮点数) np.mod(x,y) #对元素级进行模运算 np.copysign(x,y) #将数组y中各元素的元素值的符号赋值给数组x对应的元素 >、<、>=、=<、==、!= #算术比较且产生一个布尔型的数组(相同规模但是由TRUE和FALSE构成)
karency_2021.10.10
源:北京理工大学嵩天



