zoukankan      html  css  js  c++  java
  • NumPy学习笔记

    一、NumPy简介

    Numpy(Numerical Python的简称)高性能科学计算和数据分析的基础包。其部分功能如下:

    • ndarray,具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。
    • 数组运算,不用编写循环
    • 可以读写磁盘数据,操作内存映射
    • 线性代数
    • 集成c,c++等语言

    python能够包装c、c++以numpy数组形式的数据。pandas提供了结构化或表格化数据的处理高级接口,
    还提供了numpy不具备的时间序列处理等;

    二、ndarray:多维数组对象

    ndarray:多维数组对象,快速灵活的大数据集容器,要求所有元素的类型一致,通常说的“数组”、“Numpy数组”、“ndarray”都是指“ndarray”对象。

    1、创建ndarray

    array():输入数据转换为ndarray对象,可以是python元组、列表或其他序列类型。可以自动识别dtype,或者手动指定类型


     

    示例:

    import numpy as np
    
    a = np.array([1,2,3,5,6,7])
    print(a)        #[1 2 3 5 6 7]
    
    b = np.arange(10)   
    print(b)    #[0 1 2 3 4 5 6 7 8 9]
    
    c = np.ones((3,1))
    print(c)    
    '''
    [[1.]
     [1.]
     [1.]]
    '''
    d = np.zeros((2,5))
    print(d)
    '''
    [[0. 0. 0. 0. 0.]
     [0. 0. 0. 0. 0.]]
    '''
    e = np.eye(3)
    print(e)
    '''
    [[1. 0. 0.]
     [0. 1. 0.]
     [0. 0. 1.]]
    '''
    f = np.linspace(1,10,4)
    print(f)
    '''
    [ 1.  4.  7. 10.]
    '''
    g = np.linspace(1,10,4,endpoint=False)      #endpoint=False:不包含最后一个数
    print(g)
    '''
    [1.   3.25 5.5  7.75]
    '''
    h = np.concatenate((f,g))
    print(h)
    '''
    [ 1.    4.    7.   10.    1.    3.25  5.5   7.75]
    '''

    2、ndarray常用属性:

    import numpy as np
    data=[[1,2,3,4],[5,6,7,8]]
    arr=np.array(data)
    print(arr)    
    print(arr.ndim)  #数组的维数  2
    print(arr.shape)  #数组的维度  (2,4)
    print(arr.size)  #数组的元素总个数  8
    print(arr.dtype)  #数组中元素的类型  int32
    print(arr.itemsize)  #数组中每个元素的字节大小  4
    print(arr.data)  #实际数组元素的缓冲区

    3、ndarray改变元素类型:

    可以使用astype修改dtype,接上述代码

    astype不会修改原数组,是会创建一个新数组返回

    c = a.astype('float64')
    print(c.dtype)        #float64

    4、ndarray数组的维度变化

     示例:

    import numpy as np
    
    a = np.ones((2,3,4),dtype=np.int32)
    print(a)
    '''
    [[[1 1 1 1]
      [1 1 1 1]
      [1 1 1 1]]
    
     [[1 1 1 1]
      [1 1 1 1]
      [1 1 1 1]]]
    '''
    
    b = a.reshape((3,8))        #reshape不改变原数组
    print(b)
    '''
    [[1 1 1 1 1 1 1 1]
     [1 1 1 1 1 1 1 1]
     [1 1 1 1 1 1 1 1]]
    '''
    
    c = np.ones((2,3,4),dtype=np.int32)
    c.resize((3,8))                 #resize会改变原数组
    print(c)
    '''
    [[1 1 1 1 1 1 1 1]
     [1 1 1 1 1 1 1 1]
     [1 1 1 1 1 1 1 1]]
    '''
    
    d = np.ones((2,2,3),dtype=np.int32)
    e = d.flatten()                 #进行降维,不会改变原数组
    print(e)

    5、ndarray数组转为python的中的列表

    tolist()方法

    import numpy as np
    
    a = np.ones((2,2,3),dtype=np.int32)
    print(a)
    '''
    [[[1 1 1]
      [1 1 1]]
    
     [[1 1 1]
      [1 1 1]]]
    '''
    b = a.tolist()
    print(b)
    #[[[1, 1, 1], [1, 1, 1]], [[1, 1, 1], [1, 1, 1]]]

    6、Numpy索引和切片

    Numpy切片功能与python的列用法是相同的,但是在是否复制切片数据是有区别的。

    • python列表切片的时候复制数据
    • Numpy数组切片直接操作原数组

      ①python 列表切片操作

    #
    In [24]: list1 = list(range(10))
    
    In [25]: list1
    Out[25]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    In [26]: id(list1)
    Out[26]: 104821896
    
    In [27]: list1_slice = list1[2:5]
    
    In [28]: id(list1_slice)
    Out[28]: 104992840
    
    In [29]: list1_slice
    Out[29]: [2, 3, 4]
    
    In [30]: list1_slice[0] = 100
    
    In [31]: list1_slice
    Out[31]: [100, 3, 4]
    
    In [32]: list1 # 注意2号位置没有变化
    Out[32]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

      ②、Numpy 数组切片操作

    In [33]: arr = np.arange(10)
    
    In [34]: arr
    Out[34]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    
    In [35]: id(arr)
    Out[35]: 105028784
    
    In [36]: arr_slice = arr[2:5]
    
    In [37]: arr_slice
    Out[37]: array([2, 3, 4])
    
    In [38]: arr_slice[0] = 100
    
    In [39]: arr_slice
    Out[39]: array([100,   3,   4])
    
    In [40]: id(arr_slice)
    Out[40]: 105029024
    
    In [41]: arr  #2号位置被赋值了。
    Out[41]: array([  0,   1, 100,   3,   4,   5,   6,   7,   8,   9])

    这样做的原因是Numpy为了能够更好的处理大数据集。如果每次复制将会大大的消耗内存。

    7、NumPy数组的运算

    c=a-b#加减乘除都可,将元素分别对应加减乘除,shape必须对应,除的话注意除数为0的情况print(a**2)#会对数组每个元素进行处理,也可进行一下方法遍历
    print(a.sum())#总和
    print(a.min())#最小的数
    print(a.max())#最大的数
    print(a.cumsum())#获取每个数的前n的和,比如前1个位0,前2个位0+1,前3个位0+1+2以此类推
    d=np.arange(12).reshape(3,4)
    print(d.sum(axis=-2))#总和
    print(d.min(axis=0))#最小的数
    print(d.max(axis=-1))#最大的数
    print(d.mean())#算术平均数
    print(d.std())#标准差
    print(d.var())#方差
    print(d.argmin())#最小索引
    print(d.argmax())#最大索引
    print(d.repeat(5))#重复
    print(np.power(b,3))#b的3次方
    print(np.repeat(3, 4))#创建一个一维数组,元素为3,重复4次
    print(d.cumsum(axis=1))#获取每个数的前n的和,比如前1个位0,前2个位0+1,前3个位0+1+2以此类推
    print(d.cumprod())#所有元素的累积积
    #总结:当没有axis参数的时候,默认为全部元素,当值为0或-2时,表示每个列中的第一个数,当值为1或-1时,表示以列做运算,其他值则报错
    s=np.array([4,3,1,45,2,1,23])
    s.sort()#排序
    print(np.unique(s))#找出唯一值并排序

     

     

     三、ndarray数组的存储和读取

    1、一维和二维的存储和读取

    ①、存储文件

     

    import numpy as np
    
    a = np.arange(100).reshape((4,25))
    np.savetxt('a.csv',a,fmt='%d',delimiter=',')

    ②、读取文件

    import numpy as np
    
    #读取
    b = np.loadtxt('a.csv',dtype=np.float,delimiter=',')
    print(b)

    2、多维的存储和读取

    ①存储

     

     ②读取(读取之后没有维度信息,需要自己通过reshape或者其它方式转为想要的维度)

     3、便捷存储和读取(读取时转换维度)

    四、numpy.random的随机数函数

    示例:

     

     

     

    五、numpy.random的统计函数

    示例:

     

     

     示例:

    六、numpy.random的梯度函数

     一维梯度示例:

     二维梯度示例:

     七、图像的数组表示

    通过PIL库转换图像

    from PIL import Image
    import numpy as np
    
    im = np.array(Image.open("C:壁纸.jpg"))
    #图像是一个三维数组,维度分别是高度。宽度和像素RGB值
    print(im.shape,im.dtype)
    #(1080, 1920, 3) uint8

    图像的变换测试:

    from PIL import Image
    import numpy as np
    
    im = np.array(Image.open("C:壁纸.jpg"))
    #图像是一个三维数组,维度分别是高度。宽度和像素RGB值
    print(im.shape,im.dtype)
    #(1080, 1920, 3) uint8
    
    b = [255,255,255] - im
    im2 = Image.fromarray(b.astype('uint8'))
    im2.save("python测试后的图像.jpg")

    原图:

     变换后的图像:

  • 相关阅读:
    使用可传输表空间向rac环境迁移数据
    跨平台表空间传输(linux 10g表空间跨平台迁移到window 11g
    RAC+ASM在单机上恢复的过程
    Oracle RMAN进行的一次有益测试
    ORA-00600 4194 错误
    oracle表分区详解
    数据库最大连接数
    web传参
    内置
    键盘事件
  • 原文地址:https://www.cnblogs.com/lyh233/p/12885074.html
Copyright © 2011-2022 走看看