【python】Notebook

1. 小Tips

三元運算符

類似C語言的條件運算符?:
語法:
c = a if a>b else b //如果a>b返回a,否則返回b

平均數 np.mean()

>>> a = np.array([[1, 2], [3, 4]])
>>> np.mean(a) # 將上面二維矩陣的每個元素相加除以元素個數(求平均數)
2.5
>>> np.mean(a, axis=0) # axis=0,計算每一列的均值
array([ 2.,  3.])
>>> np.mean(a, axis=1) # 計算每一行的均值
array([ 1.5,  3.5])

range() 與 np.arange()

  • range()返回的是range object,而np.arange()返回的是numpy.ndarray(type(np.arange(10)) == np.ndarray)

    • 兩者都是均勻地(evenly)等分區間;
    • range儘可用於迭代,而np.arange作用遠不止於此,它是一個序列,可被當做向量使用。
  • range()不支持步長爲小數,np.arange()支持步長爲小數

  • 兩者都可用於迭代

  • 兩者都有三個參數,以第一個參數爲起點,第三個參數爲步長,截止到第二個參數之前的不包括第二個參數的數據序列
    某種意義上,和STL中由迭代器組成的區間是一樣的,即左閉右開的區間。[first, last)或者不加嚴謹地寫作[first:step:last)

>>>range(1,5)
range(1,5)
>>>tuple(range(1, 5))
(1, 2, 3, 4)
>>>list(range(1, 5))
[1, 2, 3, 4]


>>>r = range(1, 5)
>>>type(r)
<class 'range'>

>>>for  i in range(1, 5):
...    print(i)
1
2
3
4

>>> np.arange(1, 5)
array([1, 2, 3, 4])

>>>range(1, 5, .1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'float' object cannot be interpreted as an integer

>>>np.arange(1, 5, .5)
array([ 1. ,  1.5,  2. ,  2.5,  3. ,  3.5,  4. ,  4.5])

>>>range(1, 5, 2)
>>>for i in range(1, 5, 2):
...    print(i)
1
3

>>for i in np.arange(1, 5):
...    print(i)
1
2
3
4

求最大/小值及索引值

  1. 列表
list = [9, 12, 88, 14, 25]
max_list =  max(list) # 返回最大值
max_index = list.index(max(list))# 最大值的索引
  1. numpy
  • min/max是python內置的函數

  • np.argmin/np.argmax是numpy庫中的成員函數

(可適合處理numpy.ndarray對象,可選的參數是axis=0或者1)

import numpy as np
 
a = np.array([1, 2, 3, 4])
b = np.array((5, 6, 7, 8))
c = np.array([[11, 2, 8, 4], [4, 52, 6, 17], [2, 8, 9, 100]])
 
print(a)
print(b)
print(c)
 
print(np.argmin(c))
print(np.argmin(c, axis=0)) # 按每列求出最小值的索引
print(np.argmin(c, axis=1)) # 按每行求出最小值的索引

合併 list 爲字符串

>>> seq = ('b','o','o','k')
>>> print('_'.join(seq))
>>> b_o_o_k # 輸出結果

剪切板模塊 pyperclip

pyperclip模塊不是自帶的需要安裝

pyperclip.copy(text) 把text字符串中的字符複製到剪切板

text = pyperclip.paste() 把剪切板上的字符串複製到text

將秒數轉化爲小時分鐘秒

seconds =35400
m, s = divmod(seconds, 60)
h, m = divmod(m, 60)
print("%d:%02d:%02d" % (h, m, s))

2. 數學

隨機數

import random

print( random.randint(1,10) )        # 產生 1 到 10 的一個整數型隨機數  
print( random.random() )             # 產生 0 到 1 之間的隨機浮點數
print( random.uniform(1.1,5.4) )     # 產生  1.1 到 5.4 之間的隨機浮點數,區間可以不是整數
print( random.choice('tomorrow') )   # 從序列中隨機選取一個元素
print( random.randrange(1,100,2) )   # 生成從1到100的間隔爲2的隨機整數

a=[1,3,5,6,7]                # 將序列a中的元素順序打亂
random.shuffle(a)
print(a)

3. 文件相關

按分隔文件路徑名的字符串來分割

root.split(os.sep)

數據的保存和讀取

  1. .mat 格式,Matlab 也可以使用
    保存: scipy.io.savemat()
    讀取: scipy.io.loadmat()
import scipy.io as scio
data = scio.loadmat('ex3data1.mat')
X = data['X']
Y = data['y']
scio.savemat("weights.mat", {'weights': self.weights})
  1. .npy 格式,numpy
    保存: numpy.save()
    讀取: numpy.load()
import numpy as np
a = np.mat('1,2,3;4,5,6')
np.save('a.npy',a)
data_a = np.load('a.npy')

檢查文件夾是否存在,不存在則創建

if not os.path.exists(save_path):
	os.makedirs(save_path)

判斷文件是否存在

if not os.path.isfile(Ground_Truth_file):
	get_Ground_Truth()

遍歷文件夾中所有最裏面的子文件夾中的文件

目錄中所有 不包含子文件夾文件夾 中的文件

for root, sub_dir, files in os.walk(root_path):
    # only want to read files
    if sub_dir != []:  # Go to the bottom of the directory without folder
        continue
    for file in files:
    	img = imread(os.path.join(root, file), as_gray=True)

遍歷文件夾中的所有文件

pos_img_files = os.listdir(pos_img_path)
for file in pos_img_files:
    img = imread(pos_img_path+file)

獲取當前文件名

Python獲取當前文件名可以通過__file__或者sys.argv[0],下面以test.py文件爲例.

# -*- coding: utf-8 -*-
# test.py
import sys
import os

# 絕對路徑
print(__file__)
print(sys.argv[0])

# 文件名
print(os.path.basename(__file__))
print(os.path.basename(sys.argv[0]))

輸出:

E:/Code/python3/EffectivePython/test.py
E:/Code/python3/EffectivePython/test.py
test.py
test.py

__file__和sys.argv[0]都是當前文件的絕對路徑,可以通過os.path.basename獲得文件名。

4. matplotlib 畫圖

x軸標籤旋轉

plt.xticks(rotation=45)

設置座標刻度值的大小以及刻度值的字體

plt.tick_params(labelsize=15)
labels = ax.get_xticklabels() + ax.get_yticklabels()
[label.set_fontname('Times New Roman') for label in labels]

設置橫縱座標的名稱以及對應字體格式

font = {'family': 'Times New Roman',
         'weight': 'normal',
         'size': 15,}
plt.xlabel('Value of C for LinearSVC', font)

設置輸出的圖片大小

figure, ax = plt.subplots(figsize=(12, 5))

5. sklearn

保存模型及參數

  1. pickle方法(python自帶)
from sklearn import svm #引入支持向量機 
from sklearn import datasets    #引入數據集  
clf = svm.SVC() #使用SVC進行分類 
iris = datasets.load_iris() 
X,y = iris.data, iris.target clf.fit(X,y)  #第一種方法,用python自帶的pickle庫 
import pickle with open('save/clf.pickle','wb') as f: #以寫的形式設置一個文件: 
clf.pickle  pickle.dump(clf,f)      #將clf這個訓練好的模型 存儲在變量f中,且保存


#導出模型並預測值: 
import pickle iris = datasets.load_iris() 
X,y = iris.data, iris.target  
with open('save/clf.pickle','rb') as f: 
                 #以讀取的方式 讀取模型存儲的pickle文件,並放在變量f裏  
clf_load = pickle.load(f)           #將模型存儲在變量clf_load中  
print(clf_load.predict(X[0:5]))     #調用並預測0-5的結果
  1. joblib方法(sklearn自帶)
from sklearn.externals import joblib
#保存
joblib.dump(best_lin_svm_clf, 'save/clf.pkl', compress=3)  # 保存訓練好的clf模型 compress讀取速度
#讀取
che_clf = joblib.load('save/clf.pkl')  # 讀取訓練好的clf模型

k 折交叉驗證

比如將數據集分爲10折,做一次交叉驗證,實際上它是計算了十次,將每一折都當做一次測試集,其餘九折當做訓練集,這樣循環十次。通過傳入的模型,訓練十次,最後將十次結果求平均值。將每個數據集都算一次

交叉驗證優點:

1:交叉驗證用於評估模型的預測性能,尤其是訓練好的模型在新數據上的表現,可以在一定程度上減小過擬合。
2:還可以從有限的數據中獲取儘可能多的有效信息。

我們如何利用它來選擇參數呢?

我們可以給它加上循環,通過循環不斷的改變參數,再利用交叉驗證來評估不同參數模型的能力。最終選擇能力最優的模型。

下面通過一個簡單的實例來說明:(iris鳶尾花)

from sklearn import datasets	#自帶數據集
from sklearn.model_selection import train_test_split,cross_val_score	#劃分數據 交叉驗證
from sklearn.neighbors import KNeighborsClassifier  #一個簡單的模型,只有K一個參數,類似K-means
import matplotlib.pyplot as plt
iris = datasets.load_iris()		#加載sklearn自帶的數據集
X = iris.data 			#這是數據
y = iris.target 		#這是每個數據所對應的標籤
train_X,test_X,train_y,test_y = train_test_split(X,y,test_size=1/3,random_state=3)	#這裏劃分數據以1/3的來劃分 訓練集訓練結果 測試集測試結果
k_range = range(1,31)
cv_scores = []		#用來放每個模型的結果值
for n in k_range:
    knn = KNeighborsClassifier(n)   #knn模型,這裏一個超參數可以做預測,當多個超參數時需要使用另一種方法GridSearchCV
    scores = cross_val_score(knn,train_X,train_y,cv=10,scoring='accuracy')  #cv:選擇每次測試折數  accuracy:評價指標是準確度,可以省略使用默認值,具體使用參考下面。
    cv_scores.append(scores.mean())
plt.plot(k_range,cv_scores)
plt.xlabel('K')
plt.ylabel('Accuracy')		#通過圖像選擇最好的參數
plt.show()
best_knn = KNeighborsClassifier(n_neighbors=3)	# 選擇最優的K=3傳入模型
best_knn.fit(train_X,train_y)			#訓練模型
print(best_knn.score(test_X,test_y))	#看看評分

6. opencv

1. cv2.putText 文字換行(’\n’)無法解析換行

cv2.putText 在向圖像中添加文本信息時,如果在待添加的文本中含有換行轉義符,一般它是無法正確處理的:

cv2.putText(img, "This is \n some text", (50,50), cv2.FONT_HERSHEY_SIMPLEX, .6, (0, 255, 0), 1, 2)

一種解決方案如下:

img = cv2.imread('boat.png')
text = "FPS: " + str(curr_fps) + "\nperson: " + str(person_num)
y0, dy = 15, 20
for i, txt in enumerate(text.split('\n')):
    y = y0 + i * dy
    # cv2.putText(img, txt, (50, y), cv2.FONT_HERSHEY_SIMPLEX, .6, (0, 255, 0), 1, 2)
    cv2.putText(img, text=txt, org=(3, y), fontFace=cv2.FONT_HERSHEY_SIMPLEX,
                fontScale=0.50, color=(255, 0, 0), thickness=2)

cv2.imshow('img', img)
cv2.waitKey(0)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章