Numpy

作者: zhchhhemmm | 来源:发表于2020-07-26 12:24 被阅读0次
    Ndarray对象

    NumPy 最重要的一个特点是其 N 维数组对象 ndarray
    ndarray 对象是用于存放同类型元素的多维数组
    ndarray 内部由以下内容组成:

    • 一个指向数据(内存或内存映射文件中的一块数据)的指针。
    • 数据类型或 dtype,描述在数组中的固定大小值的格子。
    • 一个表示数组形状(shape)的元组,表示各维度大小的元组。
    • 一个跨度元组(stride),其中的整数指的是为了前进到当前维度下一个元素需要"跨过"的字节数。
      创建一个 ndarray 只需调用 NumPy 的 array 函数即可:
    numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
    
    image.png

    插:
    numpy array 类的reshape的用法
    eg:

    x = np.zeros((2,3,4))
    x 是一个三维的零向量
    x.reshape(2,3,2,2)
    x 变成四维
    
    x.reshape(-1)
    返回x直接展开为1维的数组,但是x不变。和x.reshape(1,-1)等价
    x 的总元素个数: 2*3*4 = 24个
    那么x.reshape(n,-1) 返回x展开成(n, 24/n)的数组
    同理:x.reshape(-1, n)返回x展开成(24/n, n)的数组
    x.reshape(n1,n2,-1) 返回x展开成 (n1, n2, 24/(n1*n2))的数组
    
    
    ndarray的一些常见属性:
    • ndarray.ndim:
      秩,即轴的数量或维度的数量

    • ndarray.shape:
      数组的维度,对于矩阵,n 行 m 列
      返回值是一个元组
      如:a = np.array([[1,2,3],[4,5,6]])
      a.shape -> (2,3)
      通过给shape赋值还可以改变ndarray的结构:


      image.png
    • ndarray.size:
      数组元素的总个数,相当于 .shape 中 n*m 的值

    Numpy创建数组
    • numpy.empty
      numpy.empty 方法用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组:
      numpy.empty(shape, dtype = float, order = 'C')


      image.png

    注意 : 数组元素为随机值,因为它们未初始化。

    • numpy.zeros
      创建指定大小的数组,数组元素以 0 来填充:
      numpy.zeros(shape, dtype = float, order = 'C')
      注: 默认为浮点数,可以自己设置数字类型,eg:
      y = np.zeros((5,), dtype = np.int)
    • numpy.ones
      用 1 来填充数组
    Numpy从已有的数组创建数组:
    • numpy.asarray
      numpy.asarray(a, dtype = None, order = None)


      image.png

      可以把列表,元组等作为参数a传入asarray中转化为ndarray

    • numpy.frombuffer
      numpy.frombuffer 用于实现动态数组。
      numpy.frombuffer 接受 buffer 输入参数,以流的形式读入转化成 ndarray 对象。
    • numpy.fromiter
      numpy.fromiter 方法从可迭代对象中建立 ndarray 对象,返回一维数组。
    NumPy 从数值范围创建数组
    • numpy.arange
    numpy.arange(start, stop, step, dtype)
    start : 起始值,默认为0
    stop : 终止值(不包含)
    step: 步长,默认为1
    dtype:返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。
    x = np.arange(5) 
    x -> [0  1  2  3  4]
    
    • numpy.linspace
      numpy.linspace 函数用于创建一个一维数组,数组是一个等差数列构成的,格式如下:
    np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
    start : 序列的起始值
    stop:序列的终止值,如果endpoint为true,该值包含于数列中
    num : 要生成的等步长的样本数量,默认为50
    endpoint : 该值为 true 时,数列中包含stop值,反之不包含,默认是True。
    retstep : 如果为 True 时,生成的数组中会显示间距,反之不显示。 
    dtype: ndarray 的数据类型
    

    扩展:
    b =np.linspace(1,10,10).reshape([10,1])
    b ->
    [[ 1.]
    [ 2.]
    [ 3.]
    [ 4.]
    [ 5.]
    [ 6.]
    [ 7.]
    [ 8.]
    [ 9.]
    [10.]]

    • numpy.logspace
      numpy.logspace 函数用于创建一个于等比数列。格式如下:
    np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
    注:
    start : 起始值为 base ^ start  eg:base = 10 start = 1,起始值为10,start = 2 ,起始值为100
    stop:同理
    剩余同理
    
    NumPy 切片和索引
    切片
    • slice 定义切片:
    a = np.arange(10)
    s = slice(2,7,2) # 从索引2开始切,到索引7截至,步长为2
    print(a[s]) -> [2,4,6]
    
    • 冒号切片:
      和python 的list切片一致
    • 带有省略号的切片:
    a = np.array([[1,2,3],[3,4,5],[4,5,6]]) 
    a[...,1] # 第二列元素  -> [2 4 5]
    a[1,...] # 第二行元素 -> [3,4,5]
    a[...,1:] # 第二列及剩下的所有元素:
    [[2 3]
     [4 5]
     [5 6]]
    
    Numpy 广播:

    例子:
    设有两个数组 a 和 b,如果两个数组的形状相同,a.shape == b.shape , 那么
    a*b 的结果就是a与b数组对应为相乘。这要求a和b维度相同而且各维度的长度相同。
    当运算中的两个数组形状不相同时,numpy自动触发广播机制。

    a = np.array([[ 0, 0, 0],
               [10,10,10],
               [20,20,20],
               [30,30,30]])
    b = np.array([1,2,3])
    print(a + b)
    ->
    [[ 1  2  3]
     [11 12 13]
     [21 22 23]
     [31 32 33]]  
    

    由此可见,numpy自动把 b 变化成了 [[1,2,3],[1,2,3],[1,2,3],[1,2,3]],以便和a做相加

    • np.tile(a,(m,n))
      就是将矩阵 a 横向复制为原来的m倍,纵向赋值为原来的n倍
    数组修改操作
    image.png

    待续

    相关文章

      网友评论

          本文标题:Numpy

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