线性代数运算、数据处理、画图

补充

  • 比较操作(条件判断里用)

    == 等于
    != 不等于
    is 是相同对象
    is not 是不同对象

    关于 is 操作符

    • is 与 == 区别:

      is 用于判断两个变量引用对象是否为同一个, == 用于判断引用变量的值是否相等。

    可以用来做 字符串整数 的相等判断,但是不能用在 list 和 tuple 上,所以保险起见用==

          a = None
            b = None
            # True,因为None只有唯一实例
            r = a is b
    
            a = "22"
            b = "22"
            # True,直接声明的相同字符串也会指向同一个实例
            r = a is b
    
            a = [1]
            b = [1]
            # False,相等但不是同一个实例
            r = a is b
    
            a = [1]
            b = a
            c = a
            # True,指向同一个实例
            r = b is c
            
            a = 3
            d = 6
            b = 6 - 3
            c = d - 3
            e = 2
            f = d - 4
    
            print(a is b) #True
            print(a is c) #True
            print(a is e) #False
            print(a is f) #False
    
  • 布尔操作

    &and
    ` or`
    not

Numpy

NumPy 是一个 Python 包。 它代表 “Numeric Python”

我们用他来做线性代数有关的运算

  • 使用 numpy 的函数,需要我们用import 函数,将numpy 包装到我们的 python 文件里,通常我们命名为 np
import numpy as np
  • 我们一般用numpyarraymatrix 类型作为向量

    区别 :

    matrix 一定是二维的,array 可以是多维的
    matrix 可以看做二维的 array
    array 可以作为行向量或者列向量
    如果要确定向量的形状,用 matrix 构建向量
    如果用了 matrix 或 array 构建向量就一直用,不要混用。
    
  • array 类型有许多有用的属性

    • array.ndim array的维数,等于秩
    • array.shape 二维array中,表示数组的“行数”和“列数
    • array.size:数组元素的总个数
    • array.dtype:表示数组中元素类型的对象
  • array([a,b,c]) 构建向量

    使用array函数创建时,参数必须是由括号(方的或圆的)括起来的列表,而不能使用多个数值作为参数调用array。

    a = array(1,2,3,4)    # 错误
    a = array([1,2,3,4])  # 正确
    a = array((1,2,3,4))  # 正确
    
  • 可使用双重序列来表示二维的数组

     b = np.array( [ [1.5,2,3], [4,5,6,7] ] )
    
  • 用函数zeros可创建一个全是0的数组,用函数ones可创建一个全为1的数组,函数empty创建一个内容随机并且依赖与内存状态的数组

    参数是元素为数组尺寸的 list

    c = np.zeros((3,4))
    d = np.ones((2,3))
    e = np.empty((3,3))
    

    还用 dtype参数指定元素的类型

    np.ones( (2,3,4), dtype=int16 )
    
  • * array 对应位置的元素相乘

  a = np.array([[1, 2], [3, 4]])
  b = np.array([[5, 6], [7, 8]])
  print ('a * b = \n', a * b)
  • np.dot() 同线性代数中矩阵乘法的定义,点乘(array 和 matrix 都是这个,最保险)

    a = np.array([[1, 2], [3, 4]])
    b = np.array([[5, 6], [7, 8]])
    print ('np.dot(a, b) = \n', np.dot(a, b))
    
    
  • multiply() matrix 对应位置的乘法

    * matrix 点乘运算

    a = np.mat('1 2; 3 4')
    b = np.mat('5 6; 7 8');
     
    print ('a * b = \n', a * b)
    print ('np.multiply(a, b) = \n', np.multiply(a, b))
    
    
  • .transpose() 转置运算

    a = np.array([[1, 2], [3, 4]])
    print(a.transpose())
    
    
  • linspace() 在指定的间隔内返回均匀间隔的数字,

    numpy.linspace(start, stop, num, endpoint)

    start: 序列的起点

    stop:序列的终点

    num:生成的样本数

    endpoint:可选项,如果是true, 序列包括终点,如果是 false ,序列不包括终点

    x = np.linspace(1, 5, 5)
    print(x)
    
    

Pandas

  • 使用 pandas 的函数,需要我们用import 函数,将pandas 包装到我们的 python 文件里,通常我们命名为 pd

    import pandas as pd
    
    

    我们用 pandas 的函数进行数据分析

  • 读取文件

    pandas.read_excel( 'XXX.xlsx' )

    • 返回 dataframe 类型
    • 如果是 csv 文件,用pandas.read_csv( 'XXX.csv' )
  • axis

    axis = 0 匹配的是index, 涉及上下运算

    axis = 1 匹配的是columns, 涉及左右运算

  • dataframe.head( n )

    显示 dataframe 的前 n 行

    如果没有 n 输入 , 默认显示 dataframe 的前五行

  • dataframe.tail( n )

    显示 dataframe 的后 n 行

    如果没有 n 输入 , 默认显示 dataframe 的后五行

  • dataframe.info()

    显示 dataframe 的基本数据:各列的名字,数量,数据类型,占内存大小

  • 基本统计值

    • dataframe.describe()

      显示 dataframe 的一些基本统计值

    • DataFrame.mean( axis = 0 )

      • axis
    • DataFrame.sum( axis = 0 , min_count = 0)

    • DataFrame.median( axis = 0)

  • 数据修改

    • dataframe.T 转置函数

    将行和列颠倒

    • dataframe.rename() 改名函数

    给列改名marketing.rename(columns={'Age':'Year'}, inplace=True)

Series

  • Series 就如同list一样,一系列数据,每个数据对应一个索引值

    Series 就是“竖起来”的 list:

  • 和 list 一样元素可以是任意类型

  • SeriesDataframe 的关系: Series 可以从 Dataframe 的 某一列提取出来

    • catalogs = marketing['Catalogs']
      marketing.loc['Catalogs']
      
      
    • 或者用iloc[]截取出 Dataframe 的某一列

    • series.head()

      • 返回系列前五行
    • series.nunique()

      • 返回系列的唯一值的数量(出现了多少种不同的值)
    • series.value_counts()

      • 返回每个唯一值对应的数据个数

Pyplot

  • matplotlib 包是 Python 的一个绘图库。它包含了大量的工具,可以使用这些工具创建各种图形,包括简单的散点图,正弦曲线,甚至是三维图形 , 类似于 MATLAB 里强大的画图能力

    matplotlib 名字来自于“ MATLAB plot library”

    我们用他的matplotlib.pyplot 包来绘制我们最熟悉的直方图和曲线图

  • 使用 pyplot 的函数,需要我们用import 函数,将 pyplot 包装到我们的 python 文件里,通常我们命名为 plt

    import matplotlib.pyplot as plt
    
    
  • 画线形图(Line Plot)plt.plot(x,y)

    • x 是 横坐标序列,y 是纵坐标序列

    • x,y 都需要是 list 类型

    • 3.线条形状

      plot方法的关键字参数linestyle(或ls)用来设置线的样式。

      如plt.plot(x, y1, linestyle=':') 或 plt.plot(x, y1, ls=':')

      可取值为:

      - 实线(solid)

      -- 短线(dashed)

      -. 短点相间线(dashdot)

      : 虚点线(dotted)

      '', ' ', None

  • 画柱状图

    n, bins, patches = plt.hist( data, bins =7, color = 'r',alpha=0.5, density=True)

    • data 是array数组或者序列数组(二维数组)
    • bins 是共有多少个柱子
    • alpha 选择透明度[0,1]
    • 返回一个tuple 类型
      • 第一个元素是每个柱子的值 组成的数组
      • 第二个元素是每个柱子最右边值组成的数组
      • 第三个元素用于多数据集输入
  • 图像的文本处理

    我们可以为图像添加文字注释包括

    • plt.xlabel('xxx') 为 X 轴命名
    • plt.ylabel('yyyy') 为 Y 轴命名
    • plt.title('zzzz') 图像命名,显示在图标最上方
    • plt.text(m, n, 'text', 在(m,n)坐标处添加文字
    • plt.grid(true) 添加网格
    • plt.xticks 设置x坐标轴刻度
  • 画散点图

    matplotlib.pyplot.scatter(x,y,marker,c,alpha)

    • x,y 数据集
    • marker: 散点的形状
    • color: 颜色参数
#  Task2

- Task2_1_1

  - **Plot on the same figure by calling plt.hist() twice in a row**

    在同一个图里绘制两个list的柱状图,在 `matplotlib.pyplot.hist( x )` 用包含两个这list 的 list 作为第一个参量

  - **Specify a label for each histogram and use a legend**

    hist 函数( 画柱状图函数 ) 的 label 变量赋值 ['xxxx','yyyy']

  - **Specify a colour and transparency/alpha value for each in case they overlap**

    alpha 可以改变每个柱状图的透明度(0 透明到1不透明)

    color 可以改变颜色 代表不同颜色的标示符一共有八种:

    | 标记符 | 颜色 |
    | ------ | ---- |
    | 'r'    | 红   |
    | 'g'    | 绿   |
    | 'b'    | 蓝   |
    | 'c'    | 蓝绿 |
    | 'm'    | 紫红 |
    | 'y'    | 黄   |
    | 'k'    | 黑   |
    | 'w'    | 白   |

    当然还有更多选择

    ```python
    cnames = {
    'aliceblue':            '#F0F8FF',
    'antiquewhite':         '#FAEBD7',
    'aqua':                 '#00FFFF',
    'aquamarine':           '#7FFFD4',
    'azure':                '#F0FFFF',
    'beige':                '#F5F5DC',
    'bisque':               '#FFE4C4',
    'black':                '#000000',
    'blanchedalmond':       '#FFEBCD',
    'blue':                 '#0000FF',
    'blueviolet':           '#8A2BE2',
    'brown':                '#A52A2A',
    'burlywood':            '#DEB887',
    'cadetblue':            '#5F9EA0',
    'chartreuse':           '#7FFF00',
    'chocolate':            '#D2691E',
    'coral':                '#FF7F50',
    'cornflowerblue':       '#6495ED',
    ...
    ```

- Task2_1_2

  - **For reference create a histogram or plot a probability density function of normal distribution**

    画符合正态分布数据的直方图和**画正态分布函数**

  - `numpy.random.randn(*d0*, *d1*, *...*, *dn*)`

    生成符合均值0和方差1的单变量“正态”(高斯)分布的 list , `(*d0*, *d1*, *...*, *dn*)`指的是 list 的维数,例如:

    ```
    np.random.randn(2, 4)
    
    ```

    生成的就是两个 list ,每个 list 包含4个 float 类型数字

  - 计算正态分布的概率密度函数

    ![概率分布函数公式](/Users/apple/Downloads/%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83%E5%87%BD%E6%95%B0%E5%85%AC%E5%BC%8F.png)

    用`mean()`计算数据的**均值**`mean` 

    用`std()`计算**标准差**`std`

    用函数完成计算概率密度函数

  - 推荐用`matplotlib`库里的 `mlab.normpdf`函数计算

    ```python
    import matplotlib.mlab as mlab 
    y = mlab.normpdf(x,mean,std)
    ```

- Task2_1_3

  - **Standardise the Salary variable to make the comparison clearer (note that the x-axis values are different)**

    **标准化数据**

    一般指的是 Z-Score 标准化,去除均值和方差缩放

    得到的结果是,对于每个属性/每列来说所有数据都聚集在0附近,方差为1。

    公式为:( mean 均值,std 标准差 )
    $$
    (X-mean)/std
    $$
    推荐用公式法

    ```python
    xsalary_st = (xsalary-xsalary.mean())/xsalary.std()
    
    ```

    或者使用`sklearn.preprocessing.scale()`函数,直接将数据标准化

    ```python
     from sklearn import preprocessing
     xsalary_scaled =  preprocessing.scale(xsalary)
    ```

  - **Is the Customer Salary Normally Distributed?**

    **(Optional) Perform a normality test**

    **判断是否满足正态分布**

    目视法

    直方图的柱子数足够多的话,可以观察图像是否是“钟形函数”

    函数法

    使用`scipy.stats.normaltest`函数 测量数据是否符合正态分布

    ```python
    from scipy.stats import normaltest
    normaltest(salary)
    ```

    如果返回的 P 值大于0.05, 一般就认为符合正态分布

    统计学里在差异性的比较中,大于0.05表示无差异,小于0.05表示有差异.大于0.05表明与正态分布无差异,故符合正态分布

- Task_2_2_1

  - **Create the vector a=[2,−1,10]T** 

    **构建向量**

    用 `np.array()` 或者`np.matrix()` 都可以

    强调下`array` 和 `matrix`的区别:

    ```
    matrix 一定是二维的,array 可以是多维的
    
    array 可以作为行向量或者列向量
    
    如果要确定向量的形状,用 matrix 构建向量
    
    如果用了 matrix 或 array 构建向量就一直用,不要混用。
    
    ```

  - **Calculate the transpose of a and store it in variable b:**

    **向量的转置**

    用 `np.transpose()` 函数

  - **Calculate the sum of b by taking the dot product of b with a vector of all ones.**

    **生成全一矩阵**

    用`np.ones()` 函数

    默认生成的矩阵元素都是 float 类型(有小数点),可以在调用函数时加上 `dtype = int` 变量,这样生成的矩阵元素都是整数

    **矢量积(叉乘)** 

    用`np.dot(x,y)`函数,注意矢量积的顺序

    ```python
    import numpy as np
    a = np.matrix([[2,-1,10]]).transpose()
    print(a)
    b = a.transpose()
    print(b)
    ones = np.ones(a.shape)
    b_sum = np.dot(b,ones)
    print(b_sum)
    ```

- Task2_2_2

  - **Create a matrix **
    $$
    \mathbf M = \left [  \begin{array}{ccc} 1 & -1 & 2 \\ 0 & -3 & 1 \end{array} \right]
    $$
    构建矩阵 `np.matrix()`

  - **Sum the rows of M and then store the result along the diagonal of a square matrix**

    **计算矩阵每行元素的和**

    做法一(tutor): 

    M 与一个 3*2 的全一矩阵相乘,这样每一行上的值就是他们这一行的和;

    用`np.diag()` 函数,将整个矩阵相乘的结果矩阵作为参数,取出一个 list 包含对角线上的两个值(分别是第一行之和,第二行之和);

    再用`np.diag()`函数,将这个 list 作为参数,生成并打印矩阵,这个矩阵的对角线上的值就是 list 里的第一行之和,第二行之和

    ```python
    import numpy as np
    M = np.array(((1,-1,2),(0,-3,1)))
    print(M)
    ones = np.ones((3,2))
    S = np.diag( np.dot(M,ones))
    S = np.diag(S)
    print(S)
    ```

    做法二:嵌套循环(循环里还有个循环);

    先计算第一行的元素和,存在 list `row_sum` 的第一个值里;

    再计算第二行的元素和,存在 list `row_sum` 的第二个值里。

    ```python
     import numpy as np
        M = np.array(((1,-1,2),(0,-3,1)))
        print(M)
        sum = [.0,.0]
        print(M.shape)
        for x in range(M.shape[0]):
            for y in range(M.shape[1]):
                sum[x] += M[x,y]
        
         S = np.diag(sum)
         print(S)
    ```
     做法三:做法二里的嵌套循环可以用 `sum` 函数代替

    `M.sum(axis = 1)` 返回的是每行的和组成的 `list`

    ```
    import numpy as np
        M = np.array(((1,-1,2),(0,-3,1)))
        print(M)
        sum = [.0,.0]
        for i in range(len(sum)):
            sum[i] = float(M.sum(axis = 1)[i])
        S = np.diag(sum)
        print(S)
    ```

        **构建对角阵**

       用`np.diag()` 函数,传入一个 list 类型的对象

Challenges

Linspace

The linspace function takes a starting value, a stopping value and how many numbers you want to produce. The following will produce 11 numbers evenly spaced from 0 to 100.

在指定的间隔内返回均匀间隔的数字,linspace()函数

numpy.linspace(start, stop, num, endpoint)

start: 序列的起点

stop:序列的终点

num:生成的样本数

endpoint:可选项,如果是true, 序列包括终点,如果是 false ,序列不包括终点

import numpy as np

start = int(input('Start: '))
stop = int(input('Stop: '))
n = int(input('N: '))
x = np.linspace(start, stop, n)

for i in range(len(x)):
    print(x[i])

Matrix multiplication

Use Python to determine C, the matrix multiplication of matrix A and matrix B. Print the resultant matrix C.

生成矩阵和矩阵运算

import numpy as np
A = np.matrix([[2,0],[8,9],[5,8],[1,6]])
B = np.matrix([[7,9,1],[4,3,8]])
print(A*B)

Simple stats

计算数据中的最小值、最大值、平均值、和、标准差

  • 获得元素最大值的函数:max

  • 获得元素最小值的函数:min

  • 获得整个矩阵、行或列的平均值 mean()

  • 获取方差:var()

  • 获取标准差:std()

  • 获取中植:median()

  • 求和:sum()

  • 求值方向参数:axis

    • axis 不取值, 默认对整个矩阵求和

    • axis = 0,列方向求和

    • axis = 1,行方向求和

      M = np.array([(1,-1,2),(0,-3,1)])
      print(M)
      sum = M.sum #整个矩阵元素求和
      sum_vol = M.sum(axis = 0) # 按列求和
      sum_row = M.sum(axis = 1) # 按行求和
      
      
      
      
  a = np.array(values)
  print('Minimum:', a.min())
  print('Maximum:', a.max())
  print('Mean:', a.mean())
  print('Sum:', a.sum())
  print('Standard deviation', a.std())

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容