利用python进行数据分析

《利用python进行数据分析.第三版》 第四章 Numpy

一、numpy的ndarray:一种多维数组对象

  1. 创建nadrray

属性:
arr.nidm:维度
arr.shape:维度大小
arr.dtype:数值类型

表达规则:
np.函数(列表或元祖)

    1.np.array(列表或者元祖);array函数:接受一切序列型的对象:
    2.np.zeros(数值或者元祖);zeros函数:创建指定长度全0数组
    3.np.ones(数值或者元祖);ones函数:创建指定长度全1数组
    4.np.arange(数值)#后面一定跟数值
    #一维数组:np.arange(12)
    #二维数组:np.arange(12).reshape(3,4)
    
    注:以上创建函数后是列表或者数值即为一维数组;是元祖即为二维数组
    #列表转化为一维数组
    data1=[6,7.8,8,0,1]
         arr1=np.array(data1)
         arr1
         array([6. , 7.8, 8. , 0. , 1. ])
    #嵌套列表转化为多维数组
    data2=[[1,2,3,4],[5,6,7,8]]
    arr2=np.array(data2)
    arr2
    array([[1, 2, 3, 4],
           [5, 6, 7, 8]])
     #arange函数
     data3=np.arange(12)
[/code]

![这里写图片描述](https://img-
blog.csdn.net/20180725232554629?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNzg3Mjcx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)  
2.ndarray的数据类型

```code
     1. 直接设置数据类型
         arr1=np.array([1,2,3,4],np.float64)
     2. 转化数据类型:astype
         int_arr1=arr1.astype(np.int64)
     3. 传递数据属性
        int_array=np.arange(10) ; cailbers=np.array([.1,.2,.3,.4],np.float64)
        int_array.astype(cailbers.dtype)

笔记:调用astype总会创建一个新的数组(一个数据的备份),即使新的dtype与旧的dtype相同

3.NumPy数组的运算

      1. 大小相等的数组之间的任何算术运算都会将运算应用到元素级:
      2. 数组与标量的算术运算会将标量值传播到各个元素:
      3. 大小相同的数组之间的比较会生成布尔值数组:

4.基本的索引和切片

      1. 一维数组:类似于Python
      arr[2];arr[3:6];
      arr[3:6]=12#该层意思是将12这个值广播到第四个数到第六个数,该范围内的数值均为12
    
      #跟列表最重要的区别在于,数组切片是原始数组的视图。这意味着数据不会被复制,视图上的任何修改都会直接反映到源数组上。
      arr=np.arange(10)
      arr_slice=arr[3:6]#取一切片
      arr_slice[1]=78#更改切片中的某个数据
      arr#切片是原始数据的视图,切片视图改变数据,原始数据也被改变
      array([ 0,  1,  2,  3, 78,  5,  6,  7,  8,  9])
    
      #更改全部切片
      arr_slice[:]=12
    
      #注意:如果你想要得到的是ndarray切片的一份副本而非视图,就需要明确地进行复制操作,例如
      arr[5:8].copy()。
    
      2. 二维数组:
      #索取某一行:arr[2]
      #索取某一行某一列的具体数值:
      arr[2][1]
      arr[2,1]
      两者是等价的
    
      3.多维数组n
      #索取某个n-1维数组:arr[1]
      #索取某个n-2为数组:arr[1][0]
      ---------
     arr=np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
     arr
     array([[[ 1,  2,  3],
            [ 4,  5,  6]],
           [[ 7,  8,  9],
            [10, 11, 12]]]) 
    
    arr[0]
    array([[1, 2, 3],
           [4, 5, 6]])
    
    arr[0,1]
    array([4, 5, 6])
    
    arr[0,1,2]
    6 
[/code]

5.切片索引

```code
    1、一维数组:和python列表差不多
    2、二维数组:看下图
    3、切片赋值:arr[:2,1:]=0,图片中数字被赋值0

![这里写图片描述](https://img-
blog.csdn.net/20180726170909586?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNzg3Mjcx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

6.布尔型索引
布尔型索引就是将用True和False来判定符合条件的

    1. 一维数组:names=="Bob"-->布尔型数组
    2. 二维数组:一般结合一维数组进行判定。 data[name=="Bob"]
    #但是前提必须是:布尔型数组的长度必须跟被索引的轴长度一致。
    3. 布尔型数组和切片、整数(或整数序列)混合使用:data[name=="Bob", 2:]
    data[name=="Bob", 3]
    4. 不等于(!=)或者~: data[~(names=="Bob")]
    5. ~是反转条件
    6. 组合应用多个布尔条件:使用&、|之类的布尔运算符,但是不能使用and和or
    7. mask=(names=="Bob")|(names=="will")   -->  data[mask]
    8. 布尔类型赋值:data[data<0] =0
        data[names != "Joe"] =7

通过布尔型索引选取数组中的数据,将总是创建数据的副本,即使返回一模一样的数组也是如此。
注意:Python关键字and和or在布尔型数组中无效。要是用&与|。

7.花式索引

    #花式索引(Fancy indexing)是一个NumPy术语,它指的是利用整数数组进行索引。
    
    1. 为了以特定顺序选取行子集,只需传入一个用于指定顺序的整数列表或ndarray即可
    2. 方案一:arr[  [4,3,0,6]  ] 里面传入的是一个一维数组,这一维数组里面包括索引值。
    3. 方案二:arr[   [1,5,7,2],[0,3,1,2]   ] 得到的是一个一维数组,最终选出的是元素(1,0)、(5,3)、(7,1)和(2,2)。无论数组是多少维的,花式索引总是一维的。
    4. 方案三:如果要得到上述选取1,5,7,2行数据,又进行重新排序
    arr[  [1,3,5,7] ] [ : , [0,3,1,2]  ]
    #用np.empty法构造二维数组
    arr=np.empty((8,4))
    for i in range(8):
         arr[i]=i
    array([[0., 0., 0., 0.],
           [1., 1., 1., 1.],
           [2., 2., 2., 2.],
           [3., 3., 3., 3.],
           [4., 4., 4., 4.],
           [5., 5., 5., 5.],
           [6., 6., 6., 6.],
           [7., 7., 7., 7.]])
    #取行
    arr[[-3,-5,-7]]
    array([[5., 5., 5., 5.],
           [3., 3., 3., 3.],
           [1., 1., 1., 1.]])
    
    #取对应的一维数组
    arr[[1,5,7,2],[0,3,1,2]]
    array([1., 5., 7., 2.])
    #最终选出的是元素(1,01)、(5,3)、(7,1)和(2,2)。无论数组是多少维的,花式索引总是一维的。
    
    #取某几行的某几列
    arr[[1,5,7,2]][:,[0,3,1,2]]
    array([[1., 1., 1., 1.],
           [5., 5., 5., 5.],
           [7., 7., 7., 7.],
           [2., 2., 2., 2.]])
[/code]

8.数组转置和轴对换

```code
        1. 转置:转置是重塑的一种特殊形式,它返回的是源数据的视图(不会进行任何复制操作)。
        2. arr.T
        3. 高维数组:在进行矩阵计算时,经常需要用到该操作,比如利用np.dot计算矩阵内积:np.dot(arr.T,arr)
        4.arr=np.arange(16).reshape((2,2,4))
        arr.transpose((1,0,2)):
        第一个轴被换成了第二个,第二个轴被换成了第一个,最后一个轴不变。

二、通用函数:快速的元素级数组函数

通用函数(即ufunc)是一种对ndarray中的数据执行元素级运算的函数。你可以将其看做简单函数(接受一个或多个标量值,并产生一个或多个标量值)的矢量化包装器。

     1.一元函数:np.abs(data)
     2.二元函数:np.add(data1,data2)

![d](https://img-
blog.csdn.net/2018072621234484?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNzg3Mjcx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

![这里写图片描述](https://img-
blog.csdn.net/20180726212358853?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNzg3Mjcx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

三、利用数组进行数据处理

  1. 将条件逻辑表述为数组运算
    [code] 方法一:(x if c else y)
方法二:np.where(c,x,y)
​```code
    #方法一:学习此方法中的for in zip
    xarr=np.array([1,2,3,4,5])
    yarr=np.array([6,7,8,9,10])
    cond=np.array([True, False,True,True,False])
    
    result=[(x if c else y) 
            for x, y, c in zip(xarr, yarr, cond) ]
    
    result
    
    [1, 7, 3, 4, 10]
    
    
    方法二:np.where(c,x,y)三元函数
    arr=np.random.randn(4,4)
    arr
    np.where(arr>0,2,-2)
    
    array([[-2, -2,  2,  2],
           [-2, -2, -2,  2],
           [ 2, -2, -2, -2],
           [ 2,  2,  2,  2]])
[/code]

2.数学和统计方法  
![这里写图片描述](https://img-
blog.csdn.net/20180726235811405?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNzg3Mjcx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

arr.sum()—–>np.sum()  
arr.mean()—–>np.mena()  
arr.sum(axis=0/1)—–>np.sum(axis=0/1)

3.用于布尔型数组的方法  
arr=np.random.randn(100)  
(arr>0).sum()#arr>0是布尔数组

bools=np.array([False, False, True, False])  
bools.any()#对数组里面含有1个及以上的返回True  
bools.all()#对数组里面全部含有True的返回True

4.排序

​```code
    一维数组:arr.sort()
    二维数组:arr.sort(axis=0/1)
    高级:np.sort(arr)

5.唯一化以及其他的集合逻辑

     唯一化:np.unique(names)
     测试一个数组中的值在另一个数组中的成员资格,返回布尔型数组:np.in1d(arr_需要判定的数组,[2,3,5])#两个参数:第一个需要判定的数组,第二个是判定的条件
       values=np.array([6,0,0,3,2,5,6])       
     np.in1d(values,[2,3,5])
     array([False, False, False,  True,  True,  True, False])

![这里写图片描述](https://img-
blog.csdn.net/20180727002421171?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNzg3Mjcx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

四、用于数组的文件输入输出

          np.save("some_arr",arr)
          np.load("some_arr.npy")

五、线性代数

         x.dot(y)
         np.dot(x,y)
         x@np.oens(3)
         以上三者都是等价的

![这里写图片描述](https://img-
blog.csdn.net/20180727110921338?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNzg3Mjcx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

六、随机数生成
七、随机漫步

在这里插入图片描述

posted @ 2021-06-28 14:41  老酱  阅读(1479)  评论(0)    收藏  举报