一、为什么要用到numpy

  1. 是一个工具箱,专门做数据处理。
  2. 列表无法对数值进行批量运算,numpy可以提供新的数据结构,对这种新的结构进行处理即可实现。
  3. 需要有专门的库文件提供各种数值计算函数,如最大值最小值平均值。
  4. 导入一般使用import numpy as np用于缩写。

二、基础用法

  1. 最大值最小值平均值
    max(a);min(a)mean(a)
  2. 从列表产生数组
    1
    2
    L = [0,1,2,3]
    a = np.array(L)
    a+1 a*2 a*a 对于数组,这些对于每一个元素的操作都可以实现。

三、numpy数组基础

  1. 一维数组,不再多说
  2. 二维数组
    1
    2
    3
    4
    b = np.array([1.0,2,3],[2,3,4],[3,4,5]) #产生一个三行三列的数组。当其中一个带小数点,会自动全加上。
    np.zeros() #生成全0数组,括号里可以填“5”、“(2,3)”,分别生成一行五列、两行三列的全零数组。
    np.empty() #生成未初始化的数组,元素随机。
    np.ones() #生成全1数组。
  3. 序列数组
    1
    np.arange([start],stop,[step]) #左闭右开,取不到stop。
  4. 随机数组
    1
    2
    np.random.uniform(low,high,size) #随机小数 下限 上限 数量。数量可以是“(2,3)”这样的列表,用于生成数组。
    np.random.randint(low,high,size) #随机整数 下限 上限 数量。数量可以是“(2,3)”这样的列表,用于生成数组。
  5. 数组属性
    1
    2
    3
    4
    a = np.array(...)
    a.shape #返回(n,m) 查询数组行列。
    a.size #查看元素数量。
    a.dtype #查看元素类型。

四、索引与切片

  1. 一维数组索引
    1
    2
    3
    a = np.array(...)
    a[0] #索引第零个元素。
    a[0] = 10 #修改第零个元素。
  2. 一维数组切片
    1
    2
    3
    a[1:3] #左闭右开。
    a[1:-2] #支持负数,取到倒数第三个数。
    a[::2] #支持省略,三个数表示起始、终止、步长。-1表示反着来。
  3. 二维数组索引
    1
    2
    3
    4
    a = np.random.randint(1,10,(3,4))
    a[1,3] #序号从0开始记。
    a[1] #索引第一行。
    a[:,1] #索引第一列。
  4. 二维数组切片
    1
    2
    3
    4
    a[0,3:5] #第零行的编号3、4元素。
    a[-2:,-2:] #取最后两行最后两列。
    a[:,3] #第三行
    a[3::2,::2] #取出第三行开始没两个的行以及0、2、4列的交点。
  5. 切片的本质是引用。
    切片在内存中使用的是引用机制。
    1
    2
    a = np.arrary([0,1,2,3,4])
    b = a[2:4]
    引用机制意味着,没有为b分配新的存储地址,这时,当b改变,a也会改变。省空间。
    但这种现象在列表不存在。
    可以使用copy()的方法产生复制,用于申请新的内存。
    1
    b = a[2:4].copy()

五、花式索引

  1. 一维花式索引
    index索引:

    1
    2
    3
    a = np.arange(0,100,10) #连续的0到90。  
    index = [1,2,-3] #index是一个列表。
    Y = a[index] #取出编号1 2 -3的元素组成数组。不论是列表还是数组都可以这样取值。

    布尔索引:

    1
    2
    3
    a = np.random.randint(1,11,10)  
    b = a>5 #这时候b是一个数组,包含有布尔值的数组。
    a[b] #即可取出所有大于5的元素。
  2. 二维花式索引
    1
    2
    a[(0,1,2,3,4),(1,2,3,4,5)] #取出第零行第一个、第一行第二个...
    a[a%2 == 0] #布尔索引,取出所有偶数,但取出的是一维数组。
    • 注意一下,花式索引取出的b,是一个复制而不是引用。
  3. where语句
    1
    2
    np.where(a > 10) #返回一个元组,包含了索引的位置。
    a[np.where(a > 10)] #返回数组,包含符合要求的元素。当然,直接用`a[a>10]`也可以,但这属于是布尔索引了。

    六、元素计算

  4. 加减乘除,幂运算指数运算
    a+1 a**2 2**a
    还有个np.exp(a),e的多少次方。
  5. 常用numpy方法
    a*b 数组点乘。表示求矩阵内积。
    np.pi→π,np.sin(a),可以求三角函数。
  6. 限定小数位数
    np.round(a,2) 限定两位小数
  7. reshape
    当a是一个一行12列的。
    a.reshape(3,4) 在并不改变原数组的情况下,输出一个三行四列的数组,可以赋值给其他变量。
  8. 数组排序
    arr = np.random.randint(1,100,size=(5,4))
    sort会使原本的数组发生变化。
    arr.sort(1) 对每一行在本行内排序。
    arr.sort(0) 对每一列在本列内排序。
    • 调用方式的小tips:对numpy的数组数据而言,np.function(array)和array.function()是等效的,dot、reshape、sort、copy、sum、cumsum、max、min、mean、std等同理。但是,对于mean,np.mean()可以处理数组和列表,a.mean()只能处理数组。
  9. 数组转置
    1
    2
    3
    a = np.arange(10)  
    b = a.reshape(2,5) #变成两行五列。
    c = b.transpose() #行列互换,编程五行两列。也可以用c = b.T。单一个b.T和reshape一样,无法变成新的,赋值到c才可以。