Numpy基础之系统入门

第1章 Numpy数组对象


  1. Numpy中的多维数组称为ndarray,是Numpy中最常见的数组对象
  2. ndarray对象包括:1)数据本身;2)描述数据的元数据
  3. Numpy数组的优势
  • 由相同种类的元素组成,即数组中的数据项的类型一致;
  • 能够运用向量化运算来处理整个数组,速度较快;
  • 使用了优化过的C API,运算速度较快;


第2章 创建ndarray数组


  1. 导入numpy库时通常简写为np,这也是Numpy官方倡导的写法
    import numpy as np

  2. 常见创建方法

  • 基于listtuple
    一维数组
    arr_list = np.array([1, 2, 3, 4]) 
    
    arr_list
    -- > array([1, 2, 3, 4])
    
    print(arr_list)
    [1 2 3 4]       一维数组用print输出的时候为 [1 2 3 4],与python的列表list有差异,没有“ , ”
    
    
    
    二维数组
    arr = np.array([[1, 2, 3], [4, 5, 6]])   创建二维数组时,子list外面还有一个”[  ]”,形式为“[ [list1],  [list2] ]”
    
    arr
    array([[1, 2, 3],
           [4, 5, 6]])
    
    print(arr)
    [[1 2 3]
     [4 5 6]]
    
  • 基于np.arange()
    一维数组
    arr1 = np.arange(5) 
    print(arr1)
    [0 1 2 3 4]
    
    二维数组
    arr2 = np.array([np.arange(3), np.arange(4)])
    print(arr2)
    [array([0, 1, 2]) array([0, 1, 2, 3])]
    
  • 基于np.arange.reshape()
    三维数组
    arr3 = np.arange(24).reshape(3, 2, 4)    arange的长度要与ndarray的维度乘积相等,本例中 24 = 2X3X4
    print(arr3)
    [[[ 0  1  2  3]
      [ 4  5  6  7]]
    
     [[ 8  9 10 11]
      [12 13 14 15]]
    
     [[16 17 18 19]
      [20 21 22 23]]]
    
  • 其它方法:zeros()ones()full()eye()random.random()random.randint()random.choice()
    创建元素均为0的数组
    np.zeros((2, 3))
    array([[ 0.,  0.,  0.],
           [ 0.,  0.,  0.]])
    
    创建元素均为1的数组
    np.ones((2, 4))
    array([[ 1.,  1.,  1.,  1.],
           [ 1.,  1.,  1.,  1.]])
    
    创建元素均为指定值的数据:可以实现zeros()和ones()的功能
    np.full((2, 3), 100)
    array([[100, 100, 100],
           [100, 100, 100]])
    
    创建单位数组:左上角到右下角的折线上元素均为1
    np.eye(3)
    array([[ 1.,  0.,  0.],
           [ 0.,  1.,  0.],
           [ 0.,  0.,  1.]])
    
    创建0-1之间随机数字组成的数组
    np.random.random((3, 4))
    array([[ 0.44678911,  0.32013646,  0.79493587,  0.42866371],
           [ 0.93831111,  0.27245856,  0.85071582,  0.92076269],
           [ 0.43796771,  0.8913745 ,  0.56834941,  0.60390724]])
    
    创建指定整数范围之间随机数字组成的数组
    np.random.randint(10, 20, [2, 3])
    array([[11, 12, 19],
           [19, 12, 10]])
    
    创建指定列表中随机选择元素组成的数组
    np.random.choice(['yes', 'no', 'None'], [3, 4])
    array([['no', 'yes', 'yes', 'yes'],
           ['no', 'no', 'None', 'no'],
           ['None', 'yes', 'None', 'yes']],
           dtype='


第3章 数据类型


  1. 数据类型
数据类型 说明
bool 布尔类型,True或Fasle,占用1比特
inti 其长度取决于平台的整数,一般是int32或int64
int8 字节长度的整数,取值:[-128, 127]
int16 16位长度的整数,取值:[-32768, 32767]
int32 32位长度的整数,取值:[-2^31, 2^31 - 1]
int64 64位长度的整数,取值:[-2^63, 2^63 - 1]
uint8 8位无符号整数,取值:[0, 255]
uint16 16位无符号整数,取值:[0, 65535]
uint32 32位无符号整数,取值:[0, 2^32 - 1]
uint64 64位无符号整数,取值:[0, 2^64 - 1]
float16 16位半精度浮点数:1位符号,5位指数,10位尾数
float32 32位半精度浮点数:1位符号,8位指数,23位尾数
float或float64 双精度浮点数:1位符号,11位指数,52位尾数
complex64 复数类型,实部和虚部都是32位浮点数
complex或complex128 复数类型,实部和虚部都是64位浮点数
  1. 数据类型转换示例
    np.int8(12.34)
    -- > 12
    
    np.float(Fasle)
    -- > 0.0
    
  2. 在创建ndarray数组时,可以指定数值类型
    np.arange(4, dtype=float)
    -- > array([ 0.,  1.,  2.,  3.])
    


第4章 数组属性


  1. dtype:设置数组的数据类型
    np.arange(3, dtype='D')    'D'表示复数类型
    -- > np.arange(3, dtype='D')
    
  2. ndim:数组维度的数量
    a = np.array([[1, 2, 3], [4, 5, 6]])
    a.ndim
    -- > 2
    
  3. shape:数组对象的尺度,即矩阵的n行m列,是一个元组tuple
    a.shape
    -- > (2, 3)
    
  4. size:元素数量,即shapen*m的值
    a.size
    -- > 6
    
  5. itemsize:数组中单个元素所占用的字节数大小
    a.itemsize
    -- > 8
    
  6. nbytes:数组的字节数量,即size * itemsize
    a.nbytes
    -- > 48
    
  7. T:数组转置
    a.T
    array([[1, 4],
           [2, 5],
           [3, 6]])
    
  8. realimag:返回复数的实部和虚部
    a = np.array([1.2 + 2j, 2 + 3j])
    
    print(a)
    [ 1.2+2.j  2.0+3.j]
    
    a.real
    -- > array([ 1.2,  2. ])
    
    a.imag
    -- > array([ 2.,  3.])
    
  9. flat:返回一个numpy.flatiter可迭代对象,通过位置可以进行索引和赋值
    a = np.arange(6).reshape(2, 3)
    print(a)
    [[0 1 2]
     [3 4 5]]
    
    a.flat
        一个可迭代的对象
    
    # 对a.flat进行遍历
    for i in a.flat:
        print(i, "a中第",i,"位是:", a.flat[i])
    
    0 a中第 0 位是: 0
    1 a中第 1 位是: 1
    2 a中第 2 位是: 2
    3 a中第 3 位是: 3
    4 a中第 4 位是: 4
    5 a中第 5 位是: 5
    
    a.flat[3] = 100  #赋值
    print(a)
    [[  0   1   2]
     [100   4   5]]
    


第5章 数组索引


  1. 一维数组
    a = np.arange(7)
    a
    -- > array([0, 1, 2, 3, 4, 5, 6])
    
    a[:6:2]    #与python的list索引类似
    array([0, 2, 4])
    
  2. 二维数组:先指定行的索引,再指定列的索引
    a = np.arange(24).reshape(4, 6)
    a
    array([[ 0,  1,  2,  3,  4,  5],
           [ 6,  7,  8,  9, 10, 11],
           [12, 13, 14, 15, 16, 17],
           [18, 19, 20, 21, 22, 23]])
    
    a[1:3, 2:4]
    array([[ 8,  9],
           [14, 15]])
    
  3. 常用操作:数据筛选元素运算
    筛选大于15小于20的元素
    a[(a > 15) & (a < 20)]
    array([16, 17, 18, 19])
    
    对数组a的第2列加100
    a[0:, 1] += 100     等同于   a[np.arange(4), 1] += 100
    a
    array([[  0, 101,   2,   3,   4,   5],
           [  6, 107,   8,   9,  10,  11],
           [ 12, 113,  14,  15,  16,  17],
           [ 18, 119,  20,  21,  22,  23]])
    


第6章 数组形状转换


  1. 行列转换:reshape(n, m)resize(n, m)
    a = np.arange(12).reshape(3, 4)
    a
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    
    reshape()不会修改原数组,返回一个修改后的新数组对象
    a.reshape(4, 3)
    array([[ 0,  1,  2],
           [ 3,  4,  5],
           [ 6,  7,  8],
           [ 9, 10, 11]])
    
    resize()会对原数组进行修改,返回None
    a.resize(2, 6)
    a
    array([[ 0,  1,  2,  3,  4,  5],
           [ 6,  7,  8,  9, 10, 11]])
    
  2. 设置数组形状:shape()
    a.shape = (3, 4)
    a
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    
  3. 多维转一维:ravel()flatten()
    a.ravel()   
    array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
    
    a.flatten()
    array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
    
    区别:通过该方式对数组赋值时,ravel()返回的是view,会改变原数组,flatten()会生成新对象,原数组不变。
    a.ravel()[3] = 100
    a
    array([[  0,   1,   2, 100],      原数组的第3位数据已变成100
           [  4,   5,   6,   7],
           [  8,   9,  10,  11]])
    
    
    a.flatten()[3] = 1000
    a
    array([[  0,   1,   2, 100],      原数组的第3位数据 未 变成 1000
           [  4,   5,   6,   7],
           [  8,   9,  10,  11]])
    
  4. 转置:transpose()
    a.transpose()      #作用同于T属性
    array([[  0,   4,   8],
           [  1,   5,   9],
           [  2,   6,  10],
           [100,   7,  11]])
    


第7章 数组堆叠


  1. 水平堆叠:hstack()columns_stack()
    a = np.arange(6).reshape(2,3)
    a
    array([[0, 1, 2],
           [3, 4, 5]])
    
    np.hstack((a, a*100))
    array([[  0,   1,   2,   0, 100, 200],
           [  3,   4,   5, 300, 400, 500]])
    
    np.column_stack((a, a*0))
    array([[0, 1, 2, 0, 0, 0],
           [3, 4, 5, 0, 0, 0]])
    
  2. 垂直堆叠:vstack()row_stack()
    np.vstack((a, a*100))
    array([[  0,   1,   2],
           [  3,   4,   5],
           [  0, 100, 200],
           [300, 400, 500]])
    
    np.row_stack((a, a*0))
    array([[0, 1, 2],
           [3, 4, 5],
           [0, 0, 0],
           [0, 0, 0]])
    
  3. 指定方向叠加:concatenate()
    np.concatenate((a, a*-1), axis=0)
    array([[ 0,  1,  2],
           [ 3,  4,  5],
           [ 0, -1, -2],
           [-3, -4, -5]])
    
    np.concatenate((a, a*-1), axis=1)
    array([[ 0,  1,  2,  0, -1, -2],
           [ 3,  4,  5, -3, -4, -5]])
    
  4. 深度叠加:dstack()
    # 叠加的2个数组,必须有相同的行列数
    a = np.arange(9).reshape(3, 3)
    a
    array([[0, 1, 2],
           [3, 4, 5],
           [6, 7, 8]])
    
    b = a * -1
    b 
    array([[ 0, -1, -2],
           [-3, -4, -5],
           [-6, -7, -8]])
    
    np.dstack((a, b))
    array([[[ 0,  0],
            [ 1, -1],
            [ 2, -2]],
    
           [[ 3, -3],
            [ 4, -4],
            [ 5, -5]],
    
           [[ 6, -6],
            [ 7, -7],
            [ 8, -8]]])
    


第8章 数组拆分


  1. 横行拆分:hsplit()
    拆分的份数必须是数组列数的约数
    a = np.arange(12).reshape(2, 6)
    a
    array([[ 0,  1,  2,  3,  4,  5],
           [ 6,  7,  8,  9, 10, 11]])
    
    np.hsplit(a, 3)
    [array([[0, 1],
            [6, 7]]), 
     array([[2, 3],
            [8, 9]]), 
     array([[ 4,  5],
            [10, 11]])]
    
  2. 纵向拆分:vsplit()
    拆分的份数必须是数组行数的约数
    b = np.arange(12).reshape(6, 2)
    b
    array([[ 0,  1],
           [ 2,  3],
           [ 4,  5],
           [ 6,  7],
           [ 8,  9],
           [10, 11]])
    
    np.vsplit(b, 2)
    [array([[0, 1],
            [2, 3],
            [4, 5]]), 
     array([[ 6,  7],
            [ 8,  9],
            [10, 11]])]
    
  3. 指定方向拆分:split()
    np.split(a, 2, axis=1)
    [array([[0, 1, 2],
            [6, 7, 8]]), 
     array([[ 3,  4,  5],
            [ 9, 10, 11]])]
    
    np.split(b, 3, axis=0)
    [array([[0, 1],
            [2, 3]]), 
     array([[4, 5],
            [6, 7]]), 
     array([[ 8,  9],
            [10, 11]])]
    
  4. 深度拆分:dsplit()
    print(a)
    array([[[  0,   0],
            [  1,  -1],
            [  2,  -2],
            [  3,  -3]],
    
           [[  4,  -4],
            [  5,  -5],
            [  6,  -6],
            [  7,  -7]],
    
           [[  8,  -8],
            [  9,  -9],
            [ 10, -10],
            [ 11, -11]]])
    
    np.dsplit(b, 2)
    [array([[[ 0],
             [ 1],
             [ 2],
             [ 3]],
    
            [[ 4],
             [ 5],
             [ 6],
             [ 7]],
    
            [[ 8],
             [ 9],
             [10],
             [11]]]), 
    
     array([[[  0],
             [ -1],
             [ -2],
             [ -3]],
    
            [[ -4],
             [ -5],
             [ -6],
             [ -7]],
    
            [[ -8],
             [ -9],
             [-10],
             [-11]]])]
    


第9章 数组运算


  1. 数学四则运算:add()subtract()multiply()divide()
    a = np.array([[1, 2],[3, 4]])
    a
    array([[1, 2],
           [3, 4]])
    
    b = np.array([[9, 6], [3, 7]])
    b
    array([[9, 6],
           [3, 7]])
    
    加法
    a + b     等同于 np.add(a, b) 
    array([[10,  8],
           [ 6, 11]])
    
    减法
    a - b    等同于 np.subtract(a, b)
    array([[-8, -4],
           [ 0, -3]])
    
    乘法
    a * b    等同于 np.multiply(a, b)
    array([[ 9, 12],
           [ 9, 28]])
    
    除法
    a / b    等同于 np.divide(a, b) 
    array([[ 0.11111111,  0.33333333],
           [ 1.        ,  0.57142857]])
    
  2. 矩阵乘法:第1个数组的列数必须与第2个数组的行数相同
    a = np.array([[1, 2],[3, 4]])
    a
    array([[1, 2],
           [3, 4]])
    
    b = np.array([[1, 2, 3], [3, 4, 5]])
    b
    array([[1, 2, 3],
           [3, 4, 5]])
    
    np.dot(a, b)
    array([[ 7, 10, 13],
           [15, 22, 29]])
    
  3. 常用统计函数
    a = np.arange(12).reshape(3, 4)
    a
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    
    求(max - min)
    a.ptp(axis=0)
    array([8, 8, 8, 8])
    
    累加值
    a.cumsum(axis=1)
    array([[ 0,  1,  3,  6],
           [ 4,  9, 15, 22],
           [ 8, 17, 27, 38]])
    
    其它运算:开方
    np.sqrt(a) 
    array([[ 1.        ,  1.41421356],
           [ 1.73205081,  2.        ]])
    
    
函数 说明
len 返回个数
np.sum() 返回求和
np.mean() 返回均值
np.max() 返回最大值
np.min() 返回最小值
np.ptp() 沿指定轴返回最大值减去最小值:即(max - min)
np.std() 返回标准偏差
np.var() 返回方差
np.cumsum() 返回累加值
np.cumprod() 返回累乘积值
  1. 数组广播
  • 当数组与一个标量进行数学运算(加减乘除)时,标量会根据数组的形状进行扩展,然后执行运算,这个扩展的过程称为广播(broadcasting)
    a = np.arange(12).reshape(3, 4)
    a
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    
    a + 10000
    array([[10000, 10001, 10002, 10003],
           [10004, 10005, 10006, 10007],
           [10008, 10009, 10010, 10011]])   
    
  • 数组与一维数组的运算也可以进行广播,前提是数组的列数与一维数组的元素个数相同
    b = np.array([2, 10, 4, 8])
    b
    array([ 2, 10,  4,  8])
    
    a + b
    array([[ 2, 11,  6, 11],
           [ 6, 15, 10, 15],
           [10, 19, 14, 19]])
    
    使用tile()函数也可以实现该运算:将b在纵轴上重复3次,即和数组a的行数相同,即可直接进行数学加运算
    a + np.tile(b, (3, 1))
    array([[ 2, 11,  6, 11],
           [ 6, 15, 10, 15],
           [10, 19, 14, 19]])
    


第10章 数组函数


  1. 生成指定范围内的随机数值:uniform()
    np.random.uniform(50, 70)
    -- > 55.1791859753946
    
  2. 将数组作为一个元素,在指定方向上重复n次:tile()
    a = np.array([[1,10], [2, 200]]) 
    a
    array([[  1,  10],
           [  2, 200]])
    
    数组a,在纵轴上重复0次、在横轴上重复2次
    np.tile(a, (1, 3)) 
    array([[  1,  10,   1,  10,   1,  10],
           [  2, 200,   2, 200,   2, 200]])
    
  3. 数组元素在指定轴上(默认为横轴)排序的序号:argsort()
    a = np.array([[5, 3, 7, 1], [2, 1, 3, 9], [8, 5, 3, 6]])
    a
    array([[5, 3, 7, 1],
           [2, 1, 3, 9],
           [8, 5, 3, 6]])
    
    横轴排序
    array([[3, 1, 0, 2],
           [1, 0, 2, 3],
           [2, 1, 3, 0]])
    
    纵轴排序
    a.argsort(axis=1)   
    array([[3, 1, 0, 2],
           [1, 0, 2, 3],
           [2, 1, 3, 0]])
    
  4. 数组转成list:tolist()
    a = np.arange(12).reshape(3, 4)
    a
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    
    a.tolist()
    [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]
    
  5. 数组数据类型转换:astype()
    a.astype(float)
    array([[  0.,   1.,   2.,   3.],
           [  4.,   5.,   6.,   7.],
           [  8.,   9.,  10.,  11.]])
    

你可能感兴趣的:(Numpy基础之系统入门)