• NumPy:数组计算


    NumPy是高性能科学计算和数据分析的基础包,它是pandas等其他各种工具的基础

    NumPy的主要功能:

    1 ndarray:一个多维数组结构,高效且节省空间
    2 无需循环对整个数组进行快速运算的数学函数
    3 读写磁盘的工具以及用于操作内存映射文件的工具
    4 线性代数,随机数生成和傅里叶变换功能
    5 用于集成c,c++等代码的工具

    安装方法:

    1 pip install numpy

    引用方法:

    1 import numpy ap np

     NumPy:array-多维数组

    array比python列表快,占用空间小

    导入sys模块,对比list和np.array占用空间大小
    a = list(range(100))
     sys.getsizeof(a)
    1016
    
    b = np.array(range(100))
     sys.getsizeof(b)
    896
    创建ndarray: np.array()

    ndarray还可以是多维数组,但元素类型必须相同

    为什么要使用ndarray:

    例:
    已知购物车中没件商品的价格和商品件数,求总金额
    import random
    方法一:
    prize = [random.uniform(10.0,20.0) for i in range(20)] # 价格
    num = [random.randint(1, 10) for i in range(20)]  # 数量
    prize_np = np.array(prize)
    num_np = np.array(num)
     np.dot(prize_np, num_np)  # dot点乘,向量
    总金额:1670.34
    
    
    方法二:
    prize_np * num_np
    array([153.5 , 120.32,  53.52,  62.75,  73.5 ,  97.  ,  87.5 ,  17.13,
           125.02, 132.16, 144.36, 102.54,  39.36, 129.96,  15.56,  10.72,
            41.44,  73.98,  61.32, 128.7 ])
     _.sum()
    总金额:1670.3400000000001

    dnarray常用属性

    T  数组的转置(对高维数组而言)
    dtype  数据元素的数据类型
    # a = np.array([1, 2, 3,4,5])
    # a.dtype
    #dtype('int64')
    
    size  数组元素的个数
    # a = np.array([1, 2, 3,4,5])
     #a.size
    # 5
    
    ndim  数组的维数
    # a = np.array([1, 2, 3,4,5])
    #a.ndim
    #1
    
     a = np.arange(15).reshape(3,5)
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14]])
    a.ndim
     2
    
    
    shape  数组维度大小
    a = np.arange(20).reshape(4,5)
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14],
           [15, 16, 17, 18, 19]])
    a.shape
    (4, 5)  #4行5列

    NumPy:  ndarray-多维数组对象

    dtype:
    bool_, int(8,16, 32, 64), uint(8,16, 32, 64), float(16, 32, 64)
    
    aptype(): 类型转换
     a = np.array([1,2, 3])
    a.dtype
    dtype('int64')
    
    b = a.astype(float)
     b.dtype
     dtype('float64')
    创建ndarray:
     array(): 将列表转换为数组,可选择显示指定dtype
    In [114]: a = np.array([1, 2,3], dtype='float')
    In [115]: a
    Out[115]: array([1., 2., 3.])
    
    arange()  range的numpy版,支持浮点数
    In [116]: np.arange(3, 10, 0.2)
    Out[116]: 
    array([3. , 3.2, 3.4, 3.6, 3.8, 4. , 4.2, 4.4, 4.6, 4.8, 5. , 5.2, 5.4,
           5.6, 5.8, 6. , 6.2, 6.4, 6.6, 6.8, 7. , 7.2, 7.4, 7.6, 7.8, 8. ,
           8.2, 8.4, 8.6, 8.8, 9. , 9.2, 9.4, 9.6, 9.8])
    
    In [117]: np.arange(3, 10, 2)
    Out[117]: array([3, 5, 7, 9])
    
    linspace()  类似arange(),第三个参数为数组长度
    np.linspace(0,10,15) #  线性空间,把一个数分成多少份
    Out[52]:
    array([ 0.        ,  0.71428571,  1.42857143,  2.14285714,  2.85714286,
            3.57142857,  4.28571429,  5.        ,  5.71428571,  6.42857143,
            7.14285714,  7.85714286,  8.57142857,  9.28571429, 10.        ])
    
    
    zeros()  根据指定形状和dtype创建全0数组
    In [124]: np.zeros(10,dtype='int')
    Out[124]: array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
    
    In [125]: np.zeros(10,dtype='bool')
    Out[125]: 
    array([False, False, False, False, False, False, False, False, False,
           False])
    
    ones()  根据指定形状和dtype创建全1数组
    In [126]: np.ones(10,dtype='int')
    Out[126]: array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
    
    In [127]: np.ones(10,dtype='bool')
    Out[127]: 
    array([ True,  True,  True,  True,  True,  True,  True,  True,  True,
            True])
    
    empty()   根据指定形状和dtype创建空数组(随机值)
    eye()  根据指定边长和dtype创建单位矩阵

    NumPy: 索引和切片

    数组和标量之间的运算

    a+1  a*3 1//a  a**2
    In [131]: a = np.array(range(1, 10))
    
    In [132]: a
    Out[132]: array([1, 2, 3, 4, 5, 6, 7, 8, 9])
    
    In [133]: a+1
    Out[133]: array([ 2,  3,  4,  5,  6,  7,  8,  9, 10])
    
    In [134]: a*3
    Out[134]: array([ 3,  6,  9, 12, 15, 18, 21, 24, 27])
    
    In [135]: a//2
    Out[135]: array([0, 1, 1, 2, 2, 3, 3, 4, 4])
    
    In [136]: 1//a
    Out[136]: array([1, 0, 0, 0, 0, 0, 0, 0, 0])
    
    In [137]: a**2
    Out[137]: array([ 1,  4,  9, 16, 25, 36, 49, 64, 81])

    同样大小数组之间的运算

    a+b  a/b  a**b
    
    In [144]: a = np.array(range(1, 10))
    
    In [145]: b = np.array(range(2, 11))
    
    In [146]: a+b
    Out[146]: array([ 3,  5,  7,  9, 11, 13, 15, 17, 19])
    
    In [147]: a/b
    Out[147]: array([0, 0, 0, 0, 0, 0, 0, 0, 0])
    
    In [148]: a**b
    Out[148]: 
    array([         1,          8,         81,       1024,      15625,
               279936,    5764801,  134217728, 3486784401])

    数组的索引

    In [149]: a = np.array(range(10))
    In [150]: a[5]
    Out[150]: 5

    数组的切片

    In [161]: a = np.array(range(10))
    In [163]: a[1:6]
    Out[163]: array([1, 2, 3, 4, 5])
    In [164]: a[-1]
    Out[164]: 9
    
     b = a2.reshape(3,5)  # 多维数组切片,左行右列
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14]])
    In [169]: b[0:2, 2:4]  # 1-2行的3-4列
    Out[169]: 
    array([[2, 3],
           [7, 8]])
    
    In [170]: b[0:2, 3:5]  # 1-2行的4-5列
    Out[170]: 
    array([[3, 4],
           [8, 9]])
    
    In [171]: b[:, 1]  #所有行的第2列
    Out[171]: array([ 1,  6, 11])

    与列表不同,数组切片时并不会自动复制,在切片数组上的修改会影响原数组(解决方法:copy())

    c = b[:2]
    c[-1] = 250
    In [173]: b
    Out[173]: 
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14]])
    In [178]: c = b[:2]
    
    In [179]: c
    Out[179]: 
    array([[0, 1, 2, 3, 4],
           [5, 6, 7, 8, 9]])
    
    In [180]: c[-1] = 250
    In [181]: c
    Out[181]: 
    array([[  0,   1,   2,   3,   4],
           [250, 250, 250, 250, 250]])
    
    In [182]: b
    Out[182]: 
    array([[  0,   1,   2,   3,   4],
           [250, 250, 250, 250, 250],
           [ 10,  11,  12,  13,  14]])
    
    解决方法copy()
    In [185]: b
    Out[185]: 
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14]])
    In [188]: c = b[:2].copy()
    
    In [189]: c
    Out[189]: 
    array([[0, 1, 2, 3, 4],
           [5, 6, 7, 8, 9]])
    In [190]: c[-1] = 250
    
    In [191]: c
    Out[191]: 
    array([[  0,   1,   2,   3,   4],
           [250, 250, 250, 250, 250]])
    
    In [192]: b
    Out[192]: 
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14]])

    NumPy:布尔型索引

    需求:给一个数组,选出数组中所有小于5的数

    a = [random.randint(0, 20) for i in range(20)]
    
    In [70]: a
    Out[70]: [20, 19, 4, 13, 6, 15, 6, 10, 12, 17, 16, 15, 19, 10, 9, 4, 3, 12, 18, 12]
    aa = np.array(a)
    
    In [73]: aa[aa<5]
    Out[73]: array([4, 4, 3])
    原理:
    a<5会对a中的每一个元素进行判断,返回一个布尔数组
    布尔型索引:将同样大小的布尔数组传进索引,会返回一个由索引有True对应位置的元素的数组
    aa<5
    Out[74]:
    array([False, False, True, False, False, False, False, False, False,
    False, False, False, False, False, False, True, True, False,
    False, False])

    需求二:给一个数组,选出数组中所有大于5的偶数

    aa[(aa<5)&(aa%2==0)]  # and
    Out[77]: array([4, 4])

    需求三:给一个数组,选出数组中所有大于5的数和偶数 

    aa[(aa>5)|(aa%2==0)]  # or
    Out[78]: array([20,  4,  6,  6, 10, 12, 16, 10,  4,  3, 12, 18, 12])

    需求四:给一个数组,选出数组中不小于5的数

    In [79]: aa[~(aa<5)] # not
    Out[79]: array([20, 19, 13,  6, 15,  6, 10, 12, 17, 16, 15, 19, 10,  9, 12, 18, 12])

    花式索引

    需求一:对于一个数组,选出其中第1,3,6,7,9个元素,组成一个新的二维数组
    a[[1,3,6,7,9]]
    
    需求二:对一个二维数组,选出其中第一列和第三列,组成新的二维数组
    a[:, [1,3]]
    或
    a[:,[True, False, True, False, False]]  # 取1,3列
  • 相关阅读:
    【开源】知乎日报UWP 更新
    【开源】知乎日报UWP 更新
    耿丹学院软工助教(2016年上半年)
    c++ STL map 结构体
    2016搜狐笔试二叉树和最大的子树
    从B树、B+树、B*树谈到R 树
    C++继承:公有,私有,保护
    循环队列
    C++中的static关键字
    c++map的用法
  • 原文地址:https://www.cnblogs.com/YingLai/p/9281528.html
Copyright © 2020-2023  润新知