補(bǔ)充
-
比較操作(條件判斷里用)
== 等于 != 不等于 is 是相同對(duì)象 is not 是不同對(duì)象 關(guān)于
is
操作符-
is 與 == 區(qū)別:
is 用于判斷兩個(gè)變量引用對(duì)象是否為同一個(gè)撇簿, == 用于判斷引用變量的值是否相等。
可以用來(lái)做 字符串 和 整數(shù) 的相等判斷差购,但是不能用在 list 和 tuple 上,所以保險(xiǎn)起見用
==
a = None b = None # True汉嗽,因?yàn)镹one只有唯一實(shí)例 r = a is b a = "22" b = "22" # True欲逃,直接聲明的相同字符串也會(huì)指向同一個(gè)實(shí)例 r = a is b a = [1] b = [1] # False,相等但不是同一個(gè)實(shí)例 r = a is b a = [1] b = a c = a # True饼暑,指向同一個(gè)實(shí)例 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 是一個(gè) Python 包稳析。 它代表 “Numeric Python”
我們用他來(lái)做線性代數(shù)有關(guān)的運(yùn)算
- 使用 numpy 的函數(shù)洗做,需要我們用
import
函數(shù),將numpy
包裝到我們的 python 文件里,通常我們命名為np
import numpy as np
-
我們一般用
numpy
的array
和matrix
類型作為向量區(qū)別 :
matrix 一定是二維的彰居,array 可以是多維的 matrix 可以看做二維的 array array 可以作為行向量或者列向量 如果要確定向量的形狀诚纸,用 matrix 構(gòu)建向量 如果用了 matrix 或 array 構(gòu)建向量就一直用,不要混用陈惰。
-
array 類型有許多有用的屬性
-
array.ndim
array的維數(shù)畦徘,等于秩 -
array.shape
二維array中,表示數(shù)組的“行數(shù)”和“列數(shù) -
array.size
:數(shù)組元素的總個(gè)數(shù) -
array.dtype
:表示數(shù)組中元素類型的對(duì)象
-
-
array([a,b,c])
構(gòu)建向量使用array函數(shù)創(chuàng)建時(shí)抬闯,參數(shù)必須是由括號(hào)(方的或圓的)括起來(lái)的列表井辆,而不能使用多個(gè)數(shù)值作為參數(shù)調(diào)用array。
a = array(1,2,3,4) # 錯(cuò)誤 a = array([1,2,3,4]) # 正確 a = array((1,2,3,4)) # 正確
-
可使用雙重序列來(lái)表示二維的數(shù)組
b = np.array( [ [1.5,2,3], [4,5,6,7] ] )
-
用函數(shù)zeros可創(chuàng)建一個(gè)全是0的數(shù)組溶握,用函數(shù)ones可創(chuàng)建一個(gè)全為1的數(shù)組杯缺,函數(shù)empty創(chuàng)建一個(gè)內(nèi)容隨機(jī)并且依賴與內(nèi)存狀態(tài)的數(shù)組
參數(shù)是元素為數(shù)組尺寸的 list
c = np.zeros((3,4)) d = np.ones((2,3)) e = np.empty((3,3))
還用
dtype
參數(shù)指定元素的類型np.ones( (2,3,4), dtype=int16 )
*
array 對(duì)應(yīng)位置的元素相乘
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
print ('a * b = \n', a * b)
-
np.dot()
同線性代數(shù)中矩陣乘法的定義,點(diǎn)乘(array 和 matrix 都是這個(gè),最保險(xiǎn))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 對(duì)應(yīng)位置的乘法*
matrix 點(diǎn)乘運(yùn)算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()
轉(zhuǎn)置運(yùn)算a = np.array([[1, 2], [3, 4]]) print(a.transpose())
-
linspace()
在指定的間隔內(nèi)返回均勻間隔的數(shù)字,numpy.linspace(start, stop, num, endpoint)
start
: 序列的起點(diǎn)stop
:序列的終點(diǎn)num
:生成的樣本數(shù)endpoint
:可選項(xiàng)睡榆,如果是true
, 序列包括終點(diǎn)萍肆,如果是false
,序列不包括終點(diǎn)x = np.linspace(1, 5, 5) print(x)
Pandas
-
使用
pandas
的函數(shù),需要我們用import
函數(shù)胀屿,將pandas
包裝到我們的 python 文件里,通常我們命名為pd
import pandas as pd
我們用
pandas
的函數(shù)進(jìn)行數(shù)據(jù)分析 -
讀取文件
pandas.read_excel( 'XXX.xlsx' )
- 返回 dataframe 類型
- 如果是
csv
文件匾鸥,用pandas.read_csv( 'XXX.csv' )
-
axis
axis = 0 匹配的是index, 涉及上下運(yùn)算
axis = 1 匹配的是columns, 涉及左右運(yùn)算
-
dataframe.head( n )
顯示
dataframe
的前 n 行如果沒有 n 輸入 , 默認(rèn)顯示 dataframe 的前五行
-
dataframe.tail( n )
顯示 dataframe 的后 n 行
如果沒有 n 輸入 , 默認(rèn)顯示 dataframe 的后五行
-
dataframe.info()
顯示 dataframe 的基本數(shù)據(jù):各列的名字碉纳,數(shù)量勿负,數(shù)據(jù)類型,占內(nèi)存大小
-
基本統(tǒng)計(jì)值
-
dataframe.describe()
顯示 dataframe 的一些基本統(tǒng)計(jì)值
-
DataFrame.mean( axis = 0 )
axis
DataFrame.sum( axis = 0 , min_count = 0)
DataFrame.median( axis = 0)
-
-
數(shù)據(jù)修改
-
dataframe.T
轉(zhuǎn)置函數(shù)
將行和列顛倒
-
dataframe.rename()
改名函數(shù)
給列改名
marketing.rename(columns={'Age':'Year'}, inplace=True)
-
Series
-
Series
就如同list一樣劳曹,一系列數(shù)據(jù)奴愉,每個(gè)數(shù)據(jù)對(duì)應(yīng)一個(gè)索引值Series
就是“豎起來(lái)”的 list: 和 list 一樣元素可以是任意類型
-
Series
和Dataframe
的關(guān)系: Series 可以從 Dataframe 的 某一列提取出來(lái)catalogs = marketing['Catalogs'] marketing.loc['Catalogs']
或者用
iloc[]
截取出Dataframe
的某一列-
series.head()
- 返回系列前五行
-
series.nunique()
- 返回系列的唯一值的數(shù)量(出現(xiàn)了多少種不同的值)
-
series.value_counts()
- 返回每個(gè)唯一值對(duì)應(yīng)的數(shù)據(jù)個(gè)數(shù)
Pyplot
-
matplotlib
包是 Python 的一個(gè)繪圖庫(kù)。它包含了大量的工具铁孵,可以使用這些工具創(chuàng)建各種圖形锭硼,包括簡(jiǎn)單的散點(diǎn)圖,正弦曲線蜕劝,甚至是三維圖形 , 類似于 MATLAB 里強(qiáng)大的畫圖能力matplotlib
名字來(lái)自于“ MATLAB plot library”我們用他的
matplotlib.pyplot
包來(lái)繪制我們最熟悉的直方圖和曲線圖 -
使用
pyplot
的函數(shù)檀头,需要我們用import
函數(shù),將 pyplot 包裝到我們的 python 文件里,通常我們命名為plt
import matplotlib.pyplot as plt
-
畫線形圖(Line Plot)
plt.plot(x,y)
x 是 橫坐標(biāo)序列岖沛,y 是縱坐標(biāo)序列
x暑始,y 都需要是 list 類型
-
3.線條形狀
plot方法的關(guān)鍵字參數(shù)linestyle(或ls)用來(lái)設(shè)置線的樣式。
如plt.plot(x, y1, linestyle=':') 或 plt.plot(x, y1, ls=':')
可取值為:
- 實(shí)線(solid)
-- 短線(dashed)
-. 短點(diǎn)相間線(dashdot)
: 虛點(diǎn)線(dotted)
'', ' ', None
-
畫柱狀圖
n, bins, patches = plt.hist( data, bins =7, color = 'r',alpha=0.5, density=True)
- data 是array數(shù)組或者序列數(shù)組(二維數(shù)組)
- bins 是共有多少個(gè)柱子
- alpha 選擇透明度[0,1]
- 返回一個(gè)
tuple
類型- 第一個(gè)元素是每個(gè)柱子的值 組成的數(shù)組
- 第二個(gè)元素是每個(gè)柱子最右邊值組成的數(shù)組
- 第三個(gè)元素用于多數(shù)據(jù)集輸入
-
圖像的文本處理
我們可以為圖像添加文字注釋包括
-
plt.xlabel('xxx')
為 X 軸命名 -
plt.ylabel('yyyy')
為 Y 軸命名 -
plt.title('zzzz')
圖像命名婴削,顯示在圖標(biāo)最上方 -
plt.text(m, n, 'text',
在(m,n)坐標(biāo)處添加文字 -
plt.grid(true)
添加網(wǎng)格 -
plt.xticks
設(shè)置x坐標(biāo)軸刻度
-
-
畫散點(diǎn)圖
matplotlib.pyplot.scatter
(x,y,marker,c,alpha)- x,y 數(shù)據(jù)集
- marker: 散點(diǎn)的形狀
- color: 顏色參數(shù)
# Task2
- Task2_1_1
- **Plot on the same figure by calling plt.hist() twice in a row**
在同一個(gè)圖里繪制兩個(gè)list的柱狀圖廊镜,在 `matplotlib.pyplot.hist( x )` 用包含兩個(gè)這list 的 list 作為第一個(gè)參量
- **Specify a label for each histogram and use a legend**
hist 函數(shù)( 畫柱狀圖函數(shù) ) 的 label 變量賦值 ['xxxx','yyyy']
- **Specify a colour and transparency/alpha value for each in case they overlap**
alpha 可以改變每個(gè)柱狀圖的透明度(0 透明到1不透明)
color 可以改變顏色 代表不同顏色的標(biāo)示符一共有八種:
| 標(biāo)記符 | 顏色 |
| ------ | ---- |
| 'r' | 紅 |
| 'g' | 綠 |
| 'b' | 藍(lán) |
| 'c' | 藍(lán)綠 |
| 'm' | 紫紅 |
| 'y' | 黃 |
| 'k' | 黑 |
| 'w' | 白 |
當(dāng)然還有更多選擇
```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**
畫符合正態(tài)分布數(shù)據(jù)的直方圖和**畫正態(tài)分布函數(shù)**
- `numpy.random.randn(*d0*, *d1*, *...*, *dn*)`
生成符合均值0和方差1的單變量“正態(tài)”(高斯)分布的 list , `(*d0*, *d1*, *...*, *dn*)`指的是 list 的維數(shù),例如:
```
np.random.randn(2, 4)
```
生成的就是兩個(gè) list ,每個(gè) list 包含4個(gè) float 類型數(shù)字
- 計(jì)算正態(tài)分布的概率密度函數(shù)
![概率分布函數(shù)公式](/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()`計(jì)算數(shù)據(jù)的**均值**`mean`
用`std()`計(jì)算**標(biāo)準(zhǔn)差**`std`
用函數(shù)完成計(jì)算概率密度函數(shù)
- 推薦用`matplotlib`庫(kù)里的 `mlab.normpdf`函數(shù)計(jì)算
```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)**
**標(biāo)準(zhǔn)化數(shù)據(jù)**
一般指的是 Z-Score 標(biāo)準(zhǔn)化唉俗,去除均值和方差縮放
得到的結(jié)果是嗤朴,對(duì)于每個(gè)屬性/每列來(lái)說(shuō)所有數(shù)據(jù)都聚集在0附近配椭,方差為1。
公式為:( mean 均值雹姊,std 標(biāo)準(zhǔn)差 )
$$
(X-mean)/std
$$
推薦用公式法
```python
xsalary_st = (xsalary-xsalary.mean())/xsalary.std()
```
或者使用`sklearn.preprocessing.scale()`函數(shù)股缸,直接將數(shù)據(jù)標(biāo)準(zhǔn)化
```python
from sklearn import preprocessing
xsalary_scaled = preprocessing.scale(xsalary)
```
- **Is the Customer Salary Normally Distributed?**
**(Optional) Perform a normality test**
**判斷是否滿足正態(tài)分布**
目視法
直方圖的柱子數(shù)足夠多的話,可以觀察圖像是否是“鐘形函數(shù)”
函數(shù)法
使用`scipy.stats.normaltest`函數(shù) 測(cè)量數(shù)據(jù)是否符合正態(tài)分布
```python
from scipy.stats import normaltest
normaltest(salary)
```
如果返回的 P 值大于0.05, 一般就認(rèn)為符合正態(tài)分布
統(tǒng)計(jì)學(xué)里在差異性的比較中,大于0.05表示無(wú)差異,小于0.05表示有差異.大于0.05表明與正態(tài)分布無(wú)差異,故符合正態(tài)分布
- Task_2_2_1
- **Create the vector a=[2,?1,10]T**
**構(gòu)建向量**
用 `np.array()` 或者`np.matrix()` 都可以
強(qiáng)調(diào)下`array` 和 `matrix`的區(qū)別:
```
matrix 一定是二維的吱雏,array 可以是多維的
array 可以作為行向量或者列向量
如果要確定向量的形狀敦姻,用 matrix 構(gòu)建向量
如果用了 matrix 或 array 構(gòu)建向量就一直用,不要混用坎背。
```
- **Calculate the transpose of a and store it in variable b:**
**向量的轉(zhuǎn)置**
用 `np.transpose()` 函數(shù)
- **Calculate the sum of b by taking the dot product of b with a vector of all ones.**
**生成全一矩陣**
用`np.ones()` 函數(shù)
默認(rèn)生成的矩陣元素都是 float 類型(有小數(shù)點(diǎn))替劈,可以在調(diào)用函數(shù)時(shí)加上 `dtype = int` 變量,這樣生成的矩陣元素都是整數(shù)
**矢量積(叉乘)**
用`np.dot(x,y)`函數(shù)得滤,注意矢量積的順序
```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]
$$
構(gòu)建矩陣 `np.matrix()`
- **Sum the rows of M and then store the result along the diagonal of a square matrix**
**計(jì)算矩陣每行元素的和**
做法一(tutor):
M 與一個(gè) 3*2 的全一矩陣相乘陨献,這樣每一行上的值就是他們這一行的和;
用`np.diag()` 函數(shù)懂更,將整個(gè)矩陣相乘的結(jié)果矩陣作為參數(shù)眨业,取出一個(gè) list 包含對(duì)角線上的兩個(gè)值(分別是第一行之和,第二行之和)沮协;
再用`np.diag()`函數(shù)龄捡,將這個(gè) list 作為參數(shù),生成并打印矩陣慷暂,這個(gè)矩陣的對(duì)角線上的值就是 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)
```
做法二:嵌套循環(huán)(循環(huán)里還有個(gè)循環(huán));
先計(jì)算第一行的元素和行瑞,存在 list `row_sum` 的第一個(gè)值里奸腺;
再計(jì)算第二行的元素和,存在 list `row_sum` 的第二個(gè)值里血久。
```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)
```
做法三:做法二里的嵌套循環(huán)可以用 `sum` 函數(shù)代替
`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)
```
**構(gòu)建對(duì)角陣**
用`np.diag()` 函數(shù)突照,傳入一個(gè) list 類型的對(duì)象
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.
在指定的間隔內(nèi)返回均勻間隔的數(shù)字,linspace()函數(shù)
numpy.linspace(start, stop, num, endpoint)
start
: 序列的起點(diǎn)
stop
:序列的終點(diǎn)
num
:生成的樣本數(shù)
endpoint
:可選項(xiàng),如果是true
, 序列包括終點(diǎn)氧吐,如果是 false
,序列不包括終點(diǎn)
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.
生成矩陣和矩陣運(yùn)算
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
計(jì)算數(shù)據(jù)中的最小值讹蘑、最大值、平均值筑舅、和座慰、標(biāo)準(zhǔn)差
獲得元素最大值的函數(shù):max
獲得元素最小值的函數(shù):min
獲得整個(gè)矩陣、行或列的平均值 mean()
獲取方差:var()
獲取標(biāo)準(zhǔn)差:std()
獲取中植:median()
求和:sum()
-
求值方向參數(shù):axis
axis 不取值豁翎, 默認(rèn)對(duì)整個(gè)矩陣求和
axis = 0角骤,列方向求和
-
axis = 1,行方向求和
M = np.array([(1,-1,2),(0,-3,1)]) print(M) sum = M.sum #整個(gè)矩陣元素求和 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())