Numpy 学习
NumPy(Numerical Python的简称)是Python数值计算最重要的基础包。大多数提供科学计算的包都是用NumPy的数组作为构建基础。
1.基础概念整合
Array数组
-
一些基本属性:
-
对于ndarray结构来说,所有内部元素需要是同一类型,若不是同类型则会自动向下取整
-
空间结构(行列情况):
array.shape
,array.shape[0]
返回第一维的长度 -
元素个数(和len不同,len事实上在一个二维数组因为嵌套的关系:返回的是行数):
array.shape
-
数组的维度:
array.ndim
-
向数组填充某元素:
array.fill(元素)
-
查询数组类型:
array.dtype()
-
如果新建一个
array2 = array1
看似是完成复制,其实只是引用关系,更改一个会改变另外一个。想要完成真正的复制操作需要:array2 = array1.copy()
-
-
索引和切片:
-
一维索引切片和python正常索引切片无异
-
二维开始,传入一个切片是对第0轴(第一个轴进行切片):
arr[:2]可以被认为是“选取arr的前两行”
而传入多个切片如:arr[:1, :2]可以被认为是“选取前两行和前三列"
-
布尔型索引:numpy.random中的randn函数可以生成一些正态分布的随机数据:
data = np.random.randn(7, 4)
-
2.数值计算
-
常规计算:array不仅可以和数直接运算,相当于数在每一位都计算,还可以两个元素数量维度相同的array直接进行计算(四则运算):
-
相同结构对应位置相乘:直接用乘号,或者
np.multiply(x,y)
-
矩阵相乘(首先得满足可乘):
np.dot(x,y)
-
基本逻辑运算:
如:x == y
:若结构相同,会根据对应位置的是否相同返回一个结构相同的内部为True或False的矩阵
-
-
按轴(维度进行计算):
np.sum(array, axis=0)
:以x轴方向计算(获得每列相加的值作为一个个元素的array数组)
np.sum(array, axis=1)
:以y轴方向计算(获得每行相加的值为一个个元素的数组)
并且与python正常迭代器一样,支持负数索引:-1为倒数第一个元素 -
连续元素的乘积:
np.prod(array)
:所有元素连乘,与sum相同,也支持按轴计算其值,如np.prod(array, axis=0)
:按x轴方向把每列的连乘结果化为一个数组 -
求最值
array.min()
或array.max()
:可以在括号填入axis=xx
对对应数轴求最值
并返回一个数组 -
任何求值的索引(位置):
array.argmin()
或array.argmax()
,同样可以按轴返回,**sum等同理 -
求均值:
array.mean()
同样可以添加轴 -
求标准差:
array.std()
同样可以添加轴 -
求方差:
array.var()
同样可以添加轴 -
上下“取整”操作:
array.clip[min,max]
:小于min的值都改为min,大于max的值都化为max -
四舍五入:
array.round()
,默认取整,括号可填入保留几位小数 -
求两个数组相同的元素(结构可以不同):
np.intersect1d(array1,array2)
(是1不是L)
3.排序
-
Numpy默认排序
np.sort(array)
默认按最后一轴的方向进行排序:如二维数组按y轴方向:按行排序
显然可以手动更改排序的轴np.sort(array, axis = 0)
如二维数组按x轴方向:按列排序
显然也可以通过加入字段arg的方式求出排序后之前的迭代器来观察array = np.argsort(array)
-
返回向已经排好序的数组应插入的下标
mp.searchsorted(array1, array2)
:返回array2向array1中插入的位置k后
4.数组形状操作
-
reshape
函数:reshape()函数可以改变数组的形状,并且原始数据不发生变化。(shape则是返回当前的形状) 例如转换为3行4列:numpy.reshape(3,4)
但是,reshape()
函数中的参数需要满足乘积等于数组中数据总数。如:当我们将8个数使用(2,3)重新排列时,python会报错。
而且,reshape()
函数得出的数组与原数组使用的是同一个存储空间,改变一个,另一个也随之改变.
可以写入一部分想要的维度数的值,剩余一个维度数填入-1,会自动算出应该转换为几维的数组
-
手动添加维度:
array = np.arrange(10) #化为一共10个元素的单维度数组 shape: (10, )
array = array[np.newaxis, :] #数组左边增加一个维度 变成 1 * 10的二维数组 shape : (1, 10)
array = array[:, np.newaxis] #数组右边增加一个维度 变成 10 * 1的二维数组 shape : (10, 1)
-
对空的多余维度进行压缩:
array = array.squeeze()
-
数组的转置操作:
array = array.transpose()
简便版array = array.T
-
数组的拼接的操作:
c = np.concatenate((a,b))
合成的两个数组应当用元组的形式保存,默认第一维度,即上下拼接
显然可以指定维度,左右拼接c = np.concatenate((a,b), axis = 1)
-
数组的一维化:
array = array.flatten()
,默认化为单行状态 -
数组的添加层数:
array = np.pad(array, pad_width = x, mode = 'constant', constant_values = y)
添加x层,值为y的数字到array数组内
5.数组生成函数
-
基本属性
-
arange()
函数:与python的range函数没有使用区别,还可以指定类型:array1 = np.arange(2, 20, 2, dtype = np.int32)
-
linspace函数:类似range函数,但不像range那样能指定步长,
array = np.linspace(10,15,5)
:可以指定10-15的范围生成等距的五个数 -
网格工具:
x, y = np.meshgrid(x, y)
-
构造一个行向量[0,1,2,3,4,5]:
array = np.r_[0:6:1]
-
构造一个列向量,上面的转置:
array = np.c_[0:6:1]
-
-
常用生成函数
-
zeros和ones生成函数:
array = np.zeros(3)
,生成一个对应维度元素值全为0 / 1
的矩阵,如果想要多维需要用括号括好,写为元组形式, 如果想要元素均为别的数,直接写array = np.ones((x , y)) * N
-
生成单位矩阵:
array = np.identity(5)
:生成一个5 * 5
大小主对角线元素为1,其他元素为0的单位矩阵
-
6.随机模块
-
指定大小矩阵生成浮点数元素:
array = np.random.rand(x, y)
,其中浮点数大小都在[0,1)
之间,每次执行数值都不同 -
指定大小矩阵生成指定大小整型元素:
array = np.random.randint(z, size = (x, y))
其中元素大小在[0,z)
之间,每次执行数值都不同 -
更改随机数精度:
np.set_printoptions(precision = x)
:保留x位小数 -
洗牌操作:
np.random.shuffle(array)
:打乱顺序,每次打乱均不同 -
想要指定随机模式:随机种子:
np.random.seed(x)
:指定x值对应的种子接下来应用到随机模块 -
随机生成正态分布的散点
numpy.random.normal(loc=0,scale=1e-2,size=shape)
参数loc(float):正态分布的均值,对应着这个分布的中心。loc=0说明这一个以Y轴为对称轴的正态分布
参数scale(float):正态分布的标准差,对应分布的宽度,scale越大,正态分布的曲线越矮胖,scale越小,曲线越高瘦
参数size(int 或者整数元组):输出的值赋在shape里,默认为None
7.文件读写
-
便捷读入一个文件的矩阵:
data = np.loadtxt('test.txt', delimiter = 'x', skiprows = (x,y,z), usecols = (x,y,z)
若分隔符为空格,或不跳过某行,可以不写后半部分 -
python写入文件:
%%writefile test.txt
1,2,3,4,5
2,3,4,5,6
8.读写array结构
-
参数默认为高精度浮点,分隔符为0 :
np.savetxt('test.txt', array1, fmt="%.2f", delimiter = ',')
若分隔符为空格,或不跳过某行,可以不写后半部分 -
保存为压缩包:
np.savez('test.npz', a = array1, b = array2)
读取操作:data = np.load('test.npz')
化为字典
这是要读研了吗
对,hhh