Numpy学习


numpy

address:https://www.numpy.org.cn/reference/

Ndarray对象

  • Ndarray等价于多维数组
  • 构造方法:
    numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)

    object:数组或者嵌套的数列
    dtype:数组元素的数据类型,可选
    copy:数组是否需要复制,如果为false,则是对原数组的引用
    order:数组在内存中样式
    subok:默认返回一个与基类类型一致的数组
    ndmin:数组最小维度

    数据类型对象dtype

    dtype实例是用来描述与数组对应的内存区域是如何使用的.
  • 数据类型
  • 数据大小
  • 数据的字节顺序(大小端,<表示小端,>表示大端)
  • 在结构化类型下,字段的名称,每个字段的数据类型和每个字段所取得内存块得部分
  • 如果数据类型是子数组,描述其形状和数据类型

构造:

numpy.dtype(object, align, copy)

类似于C的struct,要指明类型索引和类型输于的数据结构,如

d = dtype([('name',`S20`),(('grade','int8'))])

Numpy数组属性

属性 说明
ndarray.ndim 秩,即轴的数量或维度的数量
ndarray.shape 数组的维度,对于矩阵,n 行 m 列
ndarray.size 数组元素的总个数,相当于 .shape 中 n*m 的值
ndarray.dtype ndarray 对象的元素类型
ndarray.itemsize ndarray 对象中每个元素的大小,以字节为单位
ndarray.flags ndarray 对象的内存信息
ndarray.real ndarray元素的实部
ndarray.imag ndarray 元素的虚部
ndarray.data 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。

Numpy创建数组

  • numpy.empty创建一个指定形状,指定数据类型的未初始化数组 = np.empty([3,2], dtype = int)

  • numpy.zero创建一个指定大小,0填充的数组,默认为浮点数numpy.zeros(shape, dtype = float, order = 'C')

  • numpy.one创建一个指定形状,1填充的数组,默认为浮点数x = np.ones([2,2], dtype = int)

  • numpy.asarray类似array

    numpy.asarray(a, dtype = None, order = None)

    参数 描述
    a 任意形式的输入参数,可以是,列表, 列表的元组, 元组, 元组的元组, 元组的列表,多维数组
    dtype 数据类型,可选
    order 可选,有”C”和”F”两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。
    >x =  [1,2,3] 
    >a = np.asarray(x)  
  • numpy.frombuffer用于实现动态数组,接受buffer输入参数,以流的形式读入转化成ndarray对象.

    numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)

    参数 描述
    buffer 可以是任意对象,会以流的形式读入。
    dtype 返回数组的数据类型,可选
    count 读取的数据数量,默认为-1,读取所有数据。
    offset 读取的起始位置,默认为0。
    >s =  b'Hello World' 
    >a = np.frombuffer(s, dtype =  'S1')  
  • numpy.fromiter 从可迭代对象中建立ndarray对象.

    numpy.fromiter(iterable, dtype, count=-1)

    参数 描述
    iterable 可迭代对象
    dtype 返回数组的数据类型
    count 读取的数据数量,默认为-1,读取所有数据
  • numpy.arange创建数值范围并返回ndarray对象

    numpy.arange(start, stop, step, dtype)

  • numpy.linspace创建一个等差数列组成的一维数组

    np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

  • numpy.logspace创建一个等比数列

    np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)

    Numpy切片

  • 可以通过创建slice类来对数组进行切片

    s = slice(0,16,2)
    print(a[s])
  • 可以通过:和…切片

    Numpy索引

  • 整数数组索引

    设索引地址为x,y. x = {x1,x2,…xn}, y = {y1,y2,…yn},a[x,y] = [a[x1,y1],…,a[xn,yn]]

    >import numpy as np 
    >x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  >11]])  
    >rows = np.array([[0,0],[3,3]]) 
    >cols = np.array([[0,2],[0,2]]) 
    >y = x[rows,cols]  
    >print (y) ##[y[0,0],y[0,2],y[3,0],y[3,2]]
  • 布尔索引

    x = bool运算 , a[x] = {ai | ai 属于 a 且 ai满足x}

  • 花式索引

    设索引地址为x, a[x] = {ai | ai的行坐标为xi}
    设索引地址为x,y, a[x,y] = {ai | aij的行坐标为xi,aij的列坐标属于y}

    import numpy as np 
     
    x=np.arange(32).reshape((8,4))
    print (x[np.ix_([1,5,7,2],[0,3,1,2])])
    """
    [[ 4  7  5  6]
     [20 23 21 22]
     [28 31 29 30]
     [ 8 11  9 10]]
     """

    Numpy 的广播(broadcase)

    如果数组运算,这俩矩阵的shape不同,则触发broadcase.

broadcase规则

  • 让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加 1 补齐。
  • 输出数组的形状是输入数组形状的各个维度上的最大值。
  • 如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为 1 时,这个数组能够用来计算,否则出错。
  • 当输入数组的某个维度的长度为 1 时,沿着此维度运算时都用此维度上的第一组值。

    Numpy的迭代

    numpy.nditer可以将数组转化为迭代,默认是根据数组内存布局.
    nditer(array,order = "C",op_flags = ['read_only'],flags)
    其中flags可以取:
    参数 描述
    c_index 可以跟踪 C 顺序的索引
    f_index 可以跟踪 Fortran 顺序的索引
    multi_index 每次迭代可以跟踪一种索引类型
    external_loop 给出的值是具有多个值的一维数组,而不是零维数组

如果迭代一个可广播的数组,则迭代放回的是两个值,这两个值是广播之后两个数组的值

Numpy数组操作

函数 描述
reshape 不改变数据的条件下修改形状
flat 数组元素迭代器
flatten 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组
ravel 返回展开数组
transpose 对换数组的维度,转置
broadcase 返回一个数组对另一个数组广播的结果
split 分割数组

Numpy位运算

函数 描述
bitwise_and 对数组元素执行位与操作
bitwise_or 对数组元素执行位或操作
invert 按位取反
left_shift 向左移动二进制表示的位
right_shift 向右移动二进制表示的位

Numpy数学函数

numpy内置了pi,numpy.pi就是pi

  • 三角函数

    sin,cos,tan只支持弧度制
    arcsin,arccos,arctan返回弧度制,可通过degrees转化为角度值

    Numpy算术函数

    add,subtract,multiply,divide,对数组相应数据进行计算

    Numpy统计函数

  • amin函数 amin(array,axis)没有设置axis,默认当成一维数组
  • amax函数 amax(array,axis)没有设置axis,默认是一维数组
  • ptp函数 ptp(array,axis)没有设置axis,默认为一维数组
  • percentile函数percentile(array, q, axis),p是有 p% 的数据项小于或等于这个值
  • media函数media(array,axis)计算中位数
  • mean函数mean(array,axis)计算算数平均数
  • average函数mean(array,weights,returened,axis) weights需要一个权重数组,returened是返回权重和
  • std标准差函数,var方差函数

    Numpy 排序条件筛选函数

  • sortsort(a, axis, kind, order) kind为排序算法种,order就是排序字段
  • agsort返回数组从小到大的索引值
  • lexsort 对多个序列进行排序,排序时优先照顾靠后的序列
  • msort(a) 数组按第一个轴排序,返回排序后的数组副本。np.msort(a) 相等于 np.sort(a, axis=0)。
  • sort_complex(a) 对复数按照先实部后虚部的顺序进行排序。
  • partition(a, kth[, axis, kind, order]) 指定一个数,对数组进行分区
  • argpartition(a, kth[, axis, kind, order]) 可以通过关键字 kind 指定算法沿着指定轴对数组进行分区
  • numpy.argmax() 和 numpy.argmin()函数分别沿给定轴返回最大和最小元素的索引。
  • numpy.nonzero() 函数返回输入数组中非零元素的索引。
  • numpy.where() 函数返回输入数组中满足给定条件的元素的索引。
  • numpy.extract() 函数根据某个条件从数组中抽取元素,返回满足条件的元素。

    Numpy的副本和视图

    简单来说,副本和原来的数组面对的内存不一样,视图时对原来数组的引用.

视图:

  • 切片
  • view方法

副本:

  • deepCopy
  • ndarray的copy方法

    Numpy矩阵库

  • matlib.empty numpy.matlib.empty(shape, dtype, order) 创建一个随机填充的矩阵
  • matlib.zeros创建一个以 0 填充的矩阵。
  • matlib.ones 创建一个以1填充的矩阵
  • matlib.eye 创建一个对角元素为1的矩阵numpy.matlib.eye(n, M,k, dtype)其中n为行数,M为列数,K为对角线的索引
  • numpy.matlib.identity() 函数返回给定大小的单位矩阵
  • numpy.matlib.rand() 函数创建一个给定大小的矩阵,数据是随机填充的。

    Numpy线性代数

    函数 描述
    dot 一维就是数组对应相乘,高维数组就是两个矩阵相乘。
    vdot 两个向量的点积
    inner 两个数组的内积
    matmul 两个数组的矩阵积
    determinant 数组的行列式
    solve 求解线性矩阵方程
    inv 计算矩阵的乘法逆矩阵

    Numpy I/O

  • numpy.save 把一个数组存成npy形式 load取出

    numpy.save(file, arr, allow_pickle=True, fix_imports=True)

  • numpy.savez 把多个数组存成npy形式 load取出

    numpy.savez(file, *args, **kwds)

  • numpy.savetxt 把数组存储txt形式 loadtxt取出

    savetxt(FILENAME, a, fmt="%d", delimiter=",")


Author: Dovahkiin
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Dovahkiin !
  TOC