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")

    原图:

     变换后的图像:

  • 相关阅读:
    uva 10491 Cows and Cars
    uva 10910 Marks Distribution
    uva 11029 Leading and Trailing
    手算整数的平方根
    uva 10375 Choose and divide
    uva 10056 What is the Probability?
    uva 11027 Palindromic Permutation
    uva 10023 Square root
    Ural(Timus) 1081. Binary Lexicographic Sequence
    扩展欧几里得(求解线性方程)
  • 原文地址:https://www.cnblogs.com/lyh233/p/12885074.html
Copyright © 2011-2022 走看看