python库基础--numpy

numpy基础

python的基于数组的计算工具库,其本身并不包含建模和科学函数,其主要目的是提供更加快和方便的运算,其他的很多包也是根据这个包来编写的,numpy比python自身方法快10-100倍

numpy导入

通常导入numpy为np

多维数组对象

numpy中的核心之一,N维数组对象 ndarray,一种容器行数据类型
对该对象的数据操作将会应用到其中的每个元素上面
对于ndarray来说,其为多维同类数据容器,即其每个元素为相同类型
data = np.random.randn(2,3)   两行三列 二维
属性:
    1.data.shape  //返还一个元组 (2,3)  其中表示了数组中每一个维度的数量

    2.data.dtype //返还数据 dtype('float64')  返还了容器内数据的类型

    3.data.ndim //返还一个整数 为维度

多维数组对象的产生

如何生成一个ndarray类型对象

1.np.array() //传入序列型对象,生成一个ndarray的对象

2.np.zeros() //传入单个整数,生成一维全为0的ndarray,传入元组,生成元组个数维度的全为0的ndarray

3.np.empty() //用法同上,但是不是全0 全空,元素是系统内默认的垃圾数据

4.np.arange() //python的range()函数的数组版,仅能传入一个整数

5.np.full()  //根据给定形状和数据类型生成数组  如: np.full((3,3,3),4)

6.np.xx_like() //传入一个ndarray,生成一个形状相似的元素为xx的ndarray  

ndarray的数据类型

类型不用担心,反正一般也不会搞错
类型转换: .astype()
    array1 = array1.astype(np.int32)
    
    在numpy中可以简单的使用float,int 来表示和python中相同精度的数据类型

数组运算

规则:
    每个位置元素分别进行运算
    对于两个数组 会 对两个数组每个元素相对应的运算
    对于数组和标量,会将参数传递给数组中每一个元素
    对于比较,每个位置对应比较,返回一个bool类型的ndarray

    对于不同尺寸的数组,会运用广播特性

数组基本切片和索引

1.一维数组
    array1[0] //类python
    array1[0:3] //顾头不顾尾
    array1[0:3] = 12 //将12 赋值给 array1[0],array[1],array[2]的位置
    //和python区别是 该数组的切片并非是复制,而是数组本身的展示,所以,对切片的改变会影响到原数组
    //解决方法: array1[0:3].copy()    
    array1[:] //会得到全部的值

2.二维数组
    二维数组单个索引不是一个值,而是一个一维数组
    在二维数组的索引上,我们可以将0轴看为行,将1轴看为1列
    array1[0][2]
    或者,效果一样 
    array1[0,2]

    切片:
        array1[0:2] //将0轴看为一个整体,取前两行
        array[:2,1:]
        可以将索引和切片混合,得到低纬度切片 
        array[1,:2]




3.多维数组
    每次单个索引,相当于降低一个维度
    但是需要注意,每次切片依旧是视图

布尔索引

比较符 == 也可以向量化
可以利用布尔值数组来进行索引
如:
    若names = np.array(['cc','jj','gg'])
    data = np.random.randn(3,5)
    data[names == 'cc']

    可以得到cc对应的一行
    原理: 将names转换为一个bool值数组,bool为Ture的可以得到一行数据,
        除了== 还有 & | ~ 

    限制:
        布尔值数组的长度必须和数组索引轴长度一致,但当长度不对时,并不会报错,所以 要小心
        python中的 and or not 对数组无效,记住&|~

    还可以 data[data < 0] = 0 来对整个数组中每个元素进行索引操作

神奇索引

numpy中的术语
可以使用整数数组来进行数据索引
[2,3,4]
可以得到含有2,3,4行的一个ndarray
[-2,-3,-4]
也可以为负,意味从后面开始索引

传入多个数组,会得到一个整数数组
[2,3,4],[2,1,0]
2,2  3,1  4,0   会得到这三个值对应的一个一维数组

ps : .reshape() 传入元组,将数组转化为元组规定的形状, 但是并不是其本身改变

数组转置和换轴

转置: 一种特殊的数据重组形式,numpy中含有不进行复制任何内容的视图转置
data.T //输出数组的转置形式
data.transpose()  传入一个元组,元组内放入轴的新排序,可以画图看一下

通用函数 也可以称为ufunc

np.sqrt(ndarray) 对每个元素进行开方
np.exp(ndarray) 将每个元素带入e^x中
np.maximum(x,y) 取xy中大的元素

remainder_part ,whole_part = np.modf(x) 返回小数部分和整数部分
详细见:

image
image
image

面向数组编程

利用numpy进行运算可以使利用纯python快一到二个数量级,而利用数组表达式来代替显示循环的方法,被称为:向量化

x,y = np.meshgrid(*xi, **kwargs), 接收两个一维数组,生成一个二维数组
point_x = np.arange(-5,5,1)
point_y = np.arange(-5,5,1)
x,y = np.meshgrid(point_x,point_y) //点的个数分别为x,y轴上的个数,其值分别为(x,y)
z = np.sqrt(x**2 + y**2) //z为距离中心0的距离

数学和统计方法

arr.mean()  或者 np.mean(arr)//求均值
arr.sum() //求和
这些函数都有一个可选参数 axis
arr.mean(axis=n)  计算n轴上的平均值
可以形成一个下降一个维度的数组
arr.min() 最小值
arr.max() 最大值
arr.argmax() 最大值位置
arr.argmin() 最小值位置
arr.std() 标准差
arr.var() 方差
arr.cumsum() 进行累加,当其按轴进行累加时,并不会发生聚合
arr.cumprod() 累乘

布尔值数组方法

在运用前面的方法对布尔值进行计算式,布尔值会强行被转换为1或者0,因此sum() 函数可以计算布尔值数组的True或者False个数

对于布尔值数组的两个很有用的方法
bools.any() //检测时候会有至少一个为True,返回一个布尔值
bools.all() //检测数组中是否全部为True,返回一个布尔值

排序

arr.sort() //由小到大进行排序

可选参数 axis,可以按轴进行排序,返回方法为copy而不是对原数组进行排序

唯一值

np.unique(names) //返回一个仅有唯一的数组,合并同类并排序后返回


np.in2d(tested,array1) 可以检测一个数组的值是否在另一个数组中,返还一个bool数组

线性代数方法

x.dot(y) 或者 np.dot(x,y) // 矩阵乘法

numpy.linalg 拥有完整的矩阵分解的标准函数集,如求逆和行列式求解

伪随机数

np.random.normal(size = ())
得到一个size形状的正太分布样本
np.random.seed(1234) //更改种子
np.random.permutation(data) //返回一个序列的随机排序 打乱
np.random.rand(n) //在均匀分布中抽取样本
np.random.randint(low, high=None, size=None, dtype=None) //根据给定的范围随机抽取整数
np.random.randn(n) //由均值0,方差1的正态分布抽取样本
np.random.uniform //由(0,1)见的均匀分布抽取样本
posted @ 2022-01-25 18:35  cc学习之路  阅读(85)  评论(0)    收藏  举报