美文网首页
10.Python-Numpy总结

10.Python-Numpy总结

作者: Yuri7 | 来源:发表于2019-06-19 17:44 被阅读0次

    Numpy

    数组

    用list和tuple等数据结构表示数组,从列表产生数组 a=array(list),或直接将列表传入数组
    fill方法将数组设为指定值

    复数

    虚部: a.imag,实部: a.real,复共轭: a.conjugate(), 复共轭(缩写):a.conj()

    数组与字符串的转换

    转化为字符串:a.tostring()
    用Fortran的格式,按照列来读数据: a.tostring(order='F')
    从字符串中读出数据,不过要指定类型: a = np.fromstring(s, dtype=np.uint8)

    ndarray的基本属性

    属性 操作 属性 操作
    类型 type(a) 维度 a.shape()或shape(a)
    元素类型 a.dtype() 元素数量 a.size()或size(a)
    每个元素所占字节 a.itemsize() 元素所占空间 a.nbytes()
    a.dim() \ \

    数组创建函数

    函数 说明
    array 将输入数据(序列类型)直接转换为ndarray,要么推断处dtype,要么显示指定dtype
    asarray 将输入转换为ndarray
    arange 类似内置的range,但返回的的是一个ndarray而不是列表
    linspace(start,stop,N) 产生N个等距分布在[start, stop]间的元素组成的数组
    logspace(start,stop,N) 产生 N 个对数等距分布的数组,默认以10为底:
    ones,ones_like 指定形状和dtype创建一个全1数组。ones_like是以另一个数组的形状和dtype为参数
    zeros, zeros_like 类似ones,ones_like,创建全0数组
    empty, empty_like 创建新数组,只分配内存空间不填充任何值
    eye, identity 创建一个N\times N方阵(对角线为1,其余为0)
    meshgrid(x, y) 生成一个网格,x对应网格的第一维,y对应网格的第二维。

    注意:np.empty返回的都是未初始化的垃圾值
    dtype=uint8时uint8只用一个字节表示0-255整数,ord()可以查看ASCII码

    数组形状

    函数 说明
    a.shape= a.reshape() 例如:a.shape = 2,3等同于a.reshape(3,2)
    newaxis 增加数组维数,根据插入位置的不同,可以返回不同形状的数组,例如y = a[newaxis, :]
    a.squeeze() 去除多余的轴,返回一个将所有长度为1的维度去除的新数组
    a.transpose(), a.T 返回数组的转置
    a.flatten() 将多维数组转化为1维数组,b = a.flatten(),改变b并不会影响a的值
    a.flat,a.ravel() 将多维数组转化为1维数组,b = a.flat,b = aa.ravel(),相修改 b 的值会影响 a
    atleast_xd 保证数组至少有x维, x可以取值1,2,3

    索引和切片

    将一个标量值赋值给一个切片时,该值会自动传播到整个选区,和列表的最重要的区别是数组切片是原始数组的视图,所以数组不会被复制,仕途上任何修改都会直接反映到源数组上

    arr=([0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
    arr_slic= a[5:8]
    arr_slic[:] = 64
    arr
    #out: array([0, 1, 2, 3, 4, 64, 64, 64, 8, 9])
    

    如果想得到的是ndarray切片的副本而非视图,就需要显示的进行复制操作,例如arr[5:8].copy()

    数组可以通过逗号隔开的索引列表来选取单个元素,所以arr2[0][2]arr2[0,2]等价

    布尔型索引

    布尔型数组可以用于索引,布尔型数组的长度必须跟被索引的轴长度一直,此外布尔型数组和切片,整数可以混合使用

    n=[True,False, False, True, False, False]
    data[n,2:] #2:表示选取从第二列到最后一列的元素
    data[n,3]  #3表示选取第三列元素
    

    布尔条件可以使用&(和)、|(或)之类的布尔运算符,Python关键字and和or在布尔型数组中无效

    花式索引

    指利用整数数组进行索引
    以特定顺序选取行子集,只需传入一个用于指定顺序的整数列表或ndarray,例如arr[[4,3,0]]。负数索引会从末尾开始选取行,例如arr[[-3,-5]]
    arr[[row],[colum]],例如arr[[1,5,7],[0,3,1]]
    np.ix_([row][colum])函数,可以用于选取方形区域的索引器,例如arr[np.ix_([1,5,7],[0,3,1])]

    通用函数

    通用函数(ufunc)是对ndarray中的数据执行元素级运算的函数

    数组运算

    运算 函数 运算 函数 运算 函数
    a + b add(a,b) a - b subtract(a,b) a * b multiply(a,b)
    a / b divide(a,b) a ** b power(a,b) a % b remainder(a,b)

    一元ufunc

    函数 说明
    abs,fabs 计算各元素绝对值,非复数值用fabs更快
    sqrt 计算各元素平方根
    square 计算各元素平方
    exp 计算各元素指数e^x
    log,log10,log2,log1p 分别为底数为e, 10, 2,的log和log(1+x)
    sign 计算各元素的正负号:1(正数),0(零),-1(负数)
    ceil 计算各元素的ceiling值,大于等于该值得最小整数
    floor 计算各元素的floor值,小于等于该值的最大整数
    rint 将各元素四舍五入到最接近的整数,保留dtype
    modf 将数组的小数和整数部分一两个独立数组的形式返回
    isnan 判断那些值是NaN的布尔型数组
    isfinite,isinf 返回一个表示哪些是有穷,哪些是无穷的布尔型数组
    cos,cosh,sin sinh,tan,tanh 普通型和双曲型三角函数
    arccos,arccosh,arcsin arcsinh,arctan,arctanh 反三角函数
    logical_not 计算各元素not x的真值,相当于-arr
    right_shift,left_shift 左移和右移,右移时整数左补0,负数左补1
    invert 取反

    二元ufunc

    二元ufunc接受两个数组,并返回一个数组结果,少数也可以返回多个数组,例如modf

    函数 说明
    add 将数组中对应元素相加
    subtract(A,B) A中减去B的元素
    multiply 数组元素相乘
    divid, floor_divid 除法或向下圆整出发(丢弃余数)
    pow(A,B) 计算A^B
    maximum,fmax 元素级的最大值计算,fmax忽略NaN
    minmum,fmin 元素级的最小值计算,fmin忽略NaN
    mod 元素级的求模计算(除法的余数)
    greater,greater_equal,less,less_equal equal,not_equal 元素级比较,产生布尔型数组,相当于中缀运算符>,>=,<,<=,==,!=
    logical_and, logical_or, logical_xor 元素级的真值逻辑运算相当于中缀运算符&,^,
    copysign(A,B) 将B中的值的符号复制给A的值

    ufunc对象

    函数 说明
    op.reduce(a) 将op沿着某个轴应用,使得数组 a 的维数降低一维,例如a为1维数组np.add.reduce(a)相当于求和
    op.accumulate(a) accumulate 可以看成保存 reduce 每一步的结果所形成的数组。
    op.reduceat(a, indices) reduceat 方法将操作符运用到指定的下标上,返回一个与 indices 大小相同的数组
    op.outer(a, b) 对于 a 中每个元素,将 op 运用到它和b的每一个元素上所得到的结果
    #accumulate例子
    a = np.array([1,2,3,4])
    np.add.accumulate(a)
    #out: array([ 1,  3,  6, 10])
    
    a = np.array([1,1,0,1])
    np.logical_and.accumulate(a)
    #out: array([ True,  True, False, False], dtype=bool)
    
    #reducate例子
    a = np.array([0, 10, 20, 30, 40, 50])
    indices = np.array([1,4])
    np.add.reduceat(a, indices)
    #out: array([60, 90])
    
    #router例子
    a , b = np.array([0,1]), np.array([1,2,3])
    np.add.outer(a, b)
    #out:array([[1, 2, 3],[2, 3, 4]])
    

    利用数组进行数据处理

    基本数组统计方法

    方法 说明
    sum() 对数组中全部轴向元素求和sum(a)等同a.sum();a.sum(axis=0)等同sum(a,axis=0),如下轴向计算都类似
    mean() 算术平均数
    std(),var() 标准差和方差
    min(),max 最大值和最小值
    ptp() 计算max和min之差
    argmin(),argmax() 返回最大最小元素的索引
    cumsum() 所有元素的累积和
    prod()
    clip() 将数值限制在某个范围,例如a.clip(3,5),小于3的变成3,大于5的变成5
    round() 近似,默认到整数
    cumprod() 所有元素的累积和

    布尔型数组

    布尔型数组会被强制转化为1,0,因此,sum常用来对数组中的true计算
    另外有两个检测布尔值的方法any和all, .any()用于检测数组中是否都是true,.all()用于检测数组中所有值是否都为true,他们也可用于非布尔型数组,非0元素都会被当做True

    排序

    sort(a)等同于a.sort() ,会改变数组的值
    a.sort(axis):多维数组sort默认沿着最后一维排序,但他可以在任何一个轴上排序,只需要将轴编号传给sort即可
    argsort():返回的是由小到大的索引位置,用索引进行排序,不会改变数组的值,如下

    b=argsort(a)
    a[b]
    

    searchsorted(sorted_array, value):返回值在sorted_array中的位置,第一个必需是已排序的数组

    sorted_array = linspace(0,1,5)
    values = array([.1,.8,.3,.12,.5,.25])
    searchsorted(sorted_array, values)
    #out: array([1, 4, 2, 1, 2, 1], dtype=int64)
    

    where

    numpy.where()是三元表达式x if condition else y的矢量化版本,例如:

    res=[(x if c else y) for x, y, c in zip(xarr, yarr, cond)]
    #等同于
    res=np.where(cond, xarr, yarr)
    

    np.where的第二和第三各参数不必是数组,都可以是标量值,例如将数组中所有正值替换为2,负值替换为-2:np.where(a>0,2,-2)

    where(array): where 函数会返回所有非零元素的索引。

    a = array([0, 12, 5, 20])
    where(a > 10)
    #out: (array([1, 3], dtype=int64),
    

    线性代数

    numpy.linalg中有一组标准的矩阵分解运算和求行列式之类的函数

    常用的numpy.linalg函数

    函数 说明 函数 说明
    diag 以一维数组的形式返回方阵的对角线元素 dot 矩阵乘法
    trace 计算对角线元素的和 det 计算矩阵行列式
    eig 计算方阵的本征值和本征向量 inv 计算方阵的逆
    pinv 计算方阵的Morre-Prnrose伪逆 qr 计算QR分解
    svd 计算奇异值分解 solve 解线性方程组Ax=b,其中A是方阵
    lstsq 计算Ax=b的最小二乘解 A.I 阵的逆矩阵
    A**N 表示矩阵N连乘 \ \

    对角线

    查看对角线元素:a.diagonal()
    可以使用偏移来查看它的次对角线,正数表示右移,负数表示左移,例如a.diagonal(offset=1)a.diagonal(offset=-1)

    随机数生成

    部分numpy.random函数

    函数 说明 函数 说明
    seed 确定随机数生成器的种子 permutation 返回一个序列的随机排列或返回一个随机排列的范围
    shuffle 对一个序列就地随机排列 rand 产生均匀分布的样本值
    randint 从给定的上下限范围内随机选取整数 randn 产生正态分布(平均值为0,标准差为1)的样本值
    binomial 产生二项分布的样本值 normal 产生正态分布的样本值
    beta 产生beta分布的样本值 chisquare 产生卡方分布的样本值
    gamma 产生gamma分布的样本值 uniform 产生在[0,1)均匀分布的样本值

    数组广播机制

    当两个维度不相同的数组进行运算是,Numpy会根据两者的维度,自动将它们进行扩展然后进行计算。
    对于 Numpy 来说,维度匹配当且仅当:

    维度相同
    有一个的维度是1

    匹配会从最后一维开始进行,直到某一个的维度全部匹配为止,因此对于以下情况,Numpy 都会进行相应的匹配:

    a = np.array([0,10,20,30])
    a.shape = 4,1
    b = np.array([0,1,2])
    a + b
    #out:array([[ 0,  1,  2],[10, 11, 12],[20, 21, 22],[30, 31, 32]])
    

    choose 函数实现条件筛选

    choose函数类似switch和case进行条件选择

    control = np.array([[1,0,1],[2,1,0],[1,2,2]])
    np.choose(control, [10, 11, 12])  #choose 将 0,1,2 对应的值映射为了 10, 11, 12,这里的 0,1,2 表示对应的下标。
    #out:array([[11, 10, 11],[12, 11, 10],[11, 12, 12]])
    

    choose 不仅仅能接受下标参数,还可以接受下标所在的位置:

    i0 = np.array([[0,1,2], [3,4,5], [6,7,8]])
    i2 = np.array([[20,21,22],[23,24,25],[26,27,28]])
    control = np.array([[1,0,1], [2,1,0], [1,2,2]])
    np.choose(control, [i0, 10, i2])
    #out: array([[10,  1, 10],[23, 10,  5], [10, 27, 28]])
    

    数组文件的输入输出

    np.save('file_name',arr)np.load('file_name.npy')是读写磁盘数据的两个主要函数,数据是以未压缩的原始二进制格式保存在扩展名为.npy的文件中
    np.savez('file_name',arr_a,arr_b):可以将多个数组文件保存在一个压缩文件中

    存取文件文本

    np.loadtxt('file_name.txt', delimiter=',')

    相关文章

      网友评论

          本文标题:10.Python-Numpy总结

          本文链接:https://www.haomeiwen.com/subject/kvxlqctx.html