[TOC] numpy模塊 numpy簡介 numpy官方文檔: numpy是Python的一種開源的數值計算擴展庫。這種庫可用來存儲和處理大型numpy數組,比Python自身的嵌套列表結構要高效的多(該結構也可以用來表示numpy數組)。 numpy庫有兩個作用: 1. 區別於list列表,提供 ...
目錄
numpy模塊
numpy簡介
numpy官方文檔:https://docs.scipy.org/doc/numpy/reference/?v=20190307135750
numpy是Python的一種開源的數值計算擴展庫。這種庫可用來存儲和處理大型numpy數組,比Python自身的嵌套列表結構要高效的多(該結構也可以用來表示numpy數組)。
numpy庫有兩個作用:
- 區別於list列表,提供了數組操作、數組運算、以及統計分佈和簡單的數學模型
- 計算速度快,甚至要由於python內置的簡單運算,使得其成為pandas、sklearn等模塊的依賴包。高級的框架如TensorFlow、PyTorch等,其數組操作也和numpy非常相似。
numpy使用
import numpy as np
lt1 = [1,2,3]
lt2 = [4,5,6]
arry1 = np.array(lt1)
arry2 = np.array(lt2)
print(arry1*arry2) # [ 4 10 18]
創建numpy數組
# 一維數組
arr1 = np.array([1,2,4])
print(type(arr1), arr1) # <class 'numpy.ndarray'> [1 2 4]
# 二維數組
arr = np.array([
[1,2,3],
[4,5,6]
])
print(arr)
'''
[[1 2 3]
[4 5 6]]
'''
# 三維數組
arr = np.array([
[[1, 2, 3],
[4, 5, 6]],
[[1, 2, 3],
[4, 5, 6]]
])
print(arr)
'''
[[[1 2 3]
[4 5 6]]
[[1 2 3]
[4 5 6]]]
'''
numpy數組的常用屬性
屬性 | 解釋 |
---|---|
T | 數組的轉置(對高維數組而言) |
dtype | 數組元素的數據類型 |
size | 數組元素的個數 |
ndim | 數組的維數 |
shape | 數組的維度大小(以元組形式) |
astype | 類型轉換 |
dtype 數組元素的數據類型,numpy數組是屬於python解釋器的,int32 / float64 屬於numpy
# 轉置
arr = np.array([
[1, 2, 3],
[4, 5, 6]
])
print(f'arr的轉置為\n{arr.T}')
'''
arr的轉置為
[[1 4]
[2 5]
[3 6]]
'''
# dtype數據類型
arr = np.array([
[1., 2., 3.],
[4, 5, 6]
])
print(arr.dtype) # float64
# 數組元素的個數
print(arr.size) # 6
# 數組的維數
print(arr.ndim) # 2
# 數組的維度大小(以元組形式, 幾行幾列)
print(arr.shape) # (2,3)
# 數組類型轉換
arr = np.array([
[1, 2, 3],
[4, 5, 6]
])
res = arr.astype(np.float64)
print(res)
'''
[[1. 2. 3.]
[4. 5. 6.]]
'''
切割numpy數組
切分數組類似於列表的切割,numpy數組的切割涉及到行和列的切割
arr = np.array([
[1, 2, 3],
[4, 5, 6]
])
print(arr[:,:]) # 行;列 取整個數組
print(arr[0,0]) # 取第一行第一列,1
print(arr[0,:]) # 取第一行 [1 2 3]
print(arr[:,2:]) # 取第三列
'''
[[3]
[6]]
'''
賦值
arr = np.array([
[1, 2, 3],
[4, 5, 6]
])
arr[0,0] = 0
print(arr) # 將二維數組第一行第一列元素賦值為0
arr[:,:] = 0
print(arr) # 全部換為0
'''
[[0 0 0]
[0 0 0]]
'''
元組合併
# 水平合併
arr1 = np.array([
[1, 2, 3],
[4, 5, 6]
])
arr2 = np.array([
[7, 8, 9],
['a', 'b', 'c']
])
print(np.hstack((arr1,arr2))) # 只能放元組
'''
[['1' '2' '3' '7' '8' '9']
['4' '5' '6' 'a' 'b' 'c']]
'''
# 垂直合併
print(np.vstack((arr1, arr2)))
'''
[['1' '2' '3']
['4' '5' '6']
['7' '8' '9']
['a' 'b' 'c']]
'''
print(np.concatenate((arr1, arr2))) # 預設以列合併
'''
[['1' '2' '3']
['4' '5' '6']
['7' '8' '9']
['a' 'b' 'c']]
'''
print(np.concatenate((arr1, arr2), axis=1)) # 以行合併
'''
[['1' '2' '3' '7' '8' '9']
['4' '5' '6' 'a' 'b' 'c']]
'''
通過函數創建數組
方法 | 詳解 |
---|---|
array() | 將列表轉換為數組,可選擇顯式指定dtype |
arange() | range的numpy版,支持浮點數 |
linspace() | 類似arange(),第三個參數為數組長度 |
zeros() | 根據指定形狀和dtype創建全0數組 |
ones() | 根據指定形狀和dtype創建全1數組 |
eye() | 創建單位矩陣 |
empty() | 創建一個元素全隨機的數組 |
reshape() | 重塑形狀 |
ones / zeros / eye / empty
# ones
print(np.ones((2,3))) # 構建兩行三列的1
'''
[[1. 1. 1.]
[1. 1. 1.]]
'''
# zeros
print(np.zeros((2,3))) # 創建2行3列的0
'''
[[0. 0. 0.]
[0. 0. 0.]]
'''
# eye
print(np.eye(3,3)) # 創建單位矩陣
'''
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
'''
# empty
print(np.empty((2,2))) # 創建一個2行2列的數組,裡面的元素是隨機生成的
'''
[[1.42419938e-306 9.34609790e-307]
[1.29060871e-306 7.56601165e-307]]
'''
linspace / logspace
print(np.linspace(1,100,10)) # 創建一個等差數列,1-100,有10個數
# [ 1. 12. 23. 34. 45. 56. 67. 78. 89. 100.]
print(np.logspace(1,10,5)) # 創建等比數列、
# [1.00000000e+01 1.77827941e+03 3.16227766e+05 5.62341325e+07 1.00000000e+10]
arrange
print(np.arange(2,10))
# [2 3 4 5 6 7 8 9]
print(np.arange(2,10,2)) # 2-10,步長為2的數組
# [2 4 6 8]
reshape 重構形狀
arr = np.ones([2,2]) # 本來是2*2的1
# print(arr)
print(arr.reshape(1,4)) # 變成1*4的1
# [[1. 1. 1. 1.]]
數組運算
運算符 | 說明 |
---|---|
+ | 兩個numpy數組對應元素相加 |
- | 兩個numpy數組對應元素相減 |
* | 兩個numpy數組對應元素相乘 |
/ | 兩個numpy數組對應元素相除,如果都是整數則取商 |
% | 兩個numpy數組對應元素相除後取餘數 |
**n | 單個numpy數組每個元素都取n次方,如**2:每個元素都取平方 |
arr = np.array([
[3, 4, 56],
[12, 4, 25]
])
print(arr / 2)
'''
[[ 1.5 2. 28. ]
[ 6. 2. 12.5]]
'''
arr = np.array([
[3, 4, 56],
[12, 4, 25]
])
print(arr ** 2)
'''
[[ 9 16 3136]
[ 144 16 625]]
'''
numpy數組函數運算
numpy數組函數 | 詳解 |
---|---|
np.sin(arr) | 對numpy數組arr中每個元素取正弦,sin(x)sin(x) |
np.cos(arr) | 對numpy數組arr中每個元素取餘弦,cos(x)cos(x) |
np.tan(arr) | 對numpy數組arr中每個元素取正切,tan(x)tan(x) |
np.arcsin(arr) | 對numpy數組arr中每個元素取反正弦,arcsin(x)arcsin(x) |
np.arccos(arr) | 對numpy數組arr中每個元素取反餘弦,arccos(x)arccos(x) |
np.arctan(arr) | 對numpy數組arr中每個元素取反正切,arctan(x)arctan(x) |
np.exp(arr) | 對numpy數組arr中每個元素取指數函數,exex |
np.sqrt(arr) | 對numpy數組arr中每個元素開根號x−−\(\sqrt[2]{x}\) |
arr = np.array([
[3, 4, 56],
[12, 4, 25]
])
print(np.sin(arr))
'''
[[ 0.14112001 -0.7568025 -0.521551 ]
[-0.53657292 -0.7568025 -0.13235175]]
'''
numpy.random生成隨機數
函數名稱 | 函數功能 | 參數說明 |
---|---|---|
rand(d0,d1,⋯,dnd0,d1,⋯,dn) | 產生均勻分佈的隨機數 | dndn為第n維數據的維度 |
randn(d0,d1,⋯,dnd0,d1,⋯,dn) | 產生標準正態分佈隨機數 | dndn為第n維數據的維度 |
randint(low[, high, size, dtype]) | 產生隨機整數 | low:最小值;high:最大值;size:數據個數 |
random_sample([size]) | 在[0,1)[0,1)內產生隨機數 | size為隨機數的shape,可以為元祖或者列表 |
choice(a[, size]) | 從arr中隨機選擇指定數據 | arr為1維數組;size為數組形狀 |
uniform(low,high [,size]) | 給定形狀產生隨機數組 | low為最小值;high為最大值,size為數組形狀 |
shuffle(a) | 與random.shuffle相同 | a為指定數組 |
matplotlib模塊
條形圖
初始的:
from matplotlib import pyplot as plt
classes = ['3班', '4班', '5班', '6班']
students = [55, 45, 60, 50]
plt.bar(classes, students)
plt.show()
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties # 修改字體
font = FontProperties(fname='C:\Windows\Fonts\simkai.ttf') # 中文字體
classes = ['3班', '4班', '5班', '6班']
students = [55, 45, 60, 50]
classes_index = range(len(classes))
plt.bar(classes_index, students)
plt.xticks(classes_index, classes, FontProperties=font)
plt.show()
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties # 修改字體
font = FontProperties(fname='C:\Windows\Fonts\simkai.ttf') # 中文字體
plt.style.use('ggplot') # 設置背景條紋
classes = ['3班', '4班', '5班', '6班']
students = [55, 45, 60, 50]
classes_index = range(len(classes))
plt.bar(classes_index, students, color='darkblue')
plt.xlabel('學生', FontProperties=font)
plt.ylabel('學生人數', FontProperties=font)
plt.title('班級-學生人數', FontProperties=font, fontsize=20, fontweight=25)
plt.xticks(classes_index, classes, FontProperties=font) # 將x軸坐標替換成classes
plt.show()
直方圖
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties # 修改字體
font = FontProperties(fname='C:\Windows\Fonts\simkai.ttf') # 中文字體
# 修改背景為條紋
plt.style.use('ggplot')
x1 = np.random.randn(10000) # 隨機生成符合正太分佈的數
x2 = np.random.randn(10000)
plt.hist(x1, bins=50, color='darkgreen') # bins=50表示每個變數的值分成50份,即會有50根柱子
plt.show()
# 直方圖
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties # 修改字體
font = FontProperties(fname='C:\Windows\Fonts\simkai.ttf') # 中文字體
# 修改背景為條紋
plt.style.use('ggplot')
x1 = np.random.randn(10000) # 隨機生成符合正太分佈的數
x2 = np.random.randn(10000)
fig = plt.figure() # 生成一張畫布
ax1 = fig.add_subplot(1,2,1) # 一行兩列取第一個
ax2 = fig.add_subplot(1,2,2) # 一行兩列取第二個
ax1.hist(x1, bins=50, color='darkgreen') # bins=50表示每個變數的值分成50份,即會有50根柱子
ax2.hist(x2, bins=50, color='red')
# 大標題
fig.suptitle('兩個正太分佈', FontProperties=font)
# 添加子標題
ax1.set_title('x1的正態分佈', FontProperties=font)
ax2.set_title('x2的正態分佈', FontProperties=font)
plt.show()
折線圖
# 折線圖
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties # 修改字體
font = FontProperties(fname='C:\Windows\Fonts\simkai.ttf') # 中文字體
# 修改背景為條紋
plt.style.use('ggplot')
np.random.seed(1)
# 使用numpy的累加和,保證數據取值範圍不會在(0,1)內波動
x1 = np.random.randn(40).cumsum()
x2 = np.random.randn(40).cumsum()
x3 = np.random.randn(40).cumsum()
x4 = np.random.randn(40).cumsum()
plt.plot(x1, color='red', marker='o', linestyle='-', label='紅實線')
plt.plot(x2, color='yellow', marker='x', linestyle='--', label='黃虛線')
plt.plot(x3, color='blue', marker='*', linestyle='-.', label='藍點線')
plt.plot(x4, color='black', marker='s', linestyle=':', label='綠點圖')
# loc='best'給label自動選擇最好的位置
plt.legend(loc='best', prop=font)
plt.show()
散點圖+直線圖
# 散點圖
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties # 修改字體
font = FontProperties(fname='C:\Windows\Fonts\simkai.ttf')
plt.style.use('ggplot')
# fig = plt.figure(figsize=(10,20)) # 控制畫布大小
fig = plt.figure()
ax1 = fig.add_subplot(1,2,1)
ax2 = fig.add_subplot(1,2,2)
x1 = np.arange(20)
y1 = x1 ** 2
x2 = np.arange(20)
y2 = x2
ax1.scatter(x1, y1, color='red', label='紅')
ax1.scatter(x2, y2, color='blue', label='藍')
ax2.plot(x1,y1)
ax2.plot(x2,y2)
fig.suptitle('兩張圖', FontProperties=font)
ax1.set_title('散點圖', FontProperties=font)
ax2.set_title('折線圖', FontProperties=font)
ax1.legend(prop=font)
plt.show()
pandas模塊
pandas中有兩個主要的數據結構,其中Series數據結構類似於Numpy中的一維數組,DataFrame類似於多維表格數據結構。
pandas是python數據分析的核心模塊。它主要提供了五大功能:
- 支持文件存取操作,支持資料庫(sql)、html、json、pickle、csv(txt、excel)、sas、stata、hdf等。
- 支持增刪改查、切片、高階函數、分組聚合等單表操作,以及和dict、list的互相轉換。
- 支持多表拼接合併操作。
- 支持簡單的繪圖操作。
- 支持簡單的統計分析操作。
import pandas as pd
index = pd.date_range('2019-01-01', periods=6, freq='M')
print(index)
'''
DatetimeIndex(['2019-01-31', '2019-02-28', '2019-03-31', '2019-04-30',
'2019-05-31', '2019-06-30'],
dtype='datetime64[ns]', freq='M')
'''
import numpy as np
import pandas as pd
index = pd.date_range('2019-01-01', periods=6, freq='M')
columns = ['c1','c2','c3','c4']
# print(columns)
val = np.random.randn(6, 4)
# print(val)
df = pd.DataFrame(index=index, columns=columns, data=val)
# 保存文件,讀出文件
df.to_excel('data.xls')
# 讀出文件
df = pd.read_excel('data.xls', index_col=[0])
print(df)
'''
c1 c2 c3 c4
2019-01-31 -1.469848 -0.875899 -0.571439 0.274287
2019-02-28 0.783315 -0.333277 0.091470 1.484056
2019-03-31 0.611354 0.565803 -1.298068 0.666117
2019-04-30 -0.892975 -0.144261 -2.596248 1.103916
2019-05-31 -1.207643 -0.475502 -1.577926 -0.373518
2019-06-30 -0.233937 -1.492533 -0.207368 0.163620
'''
print(df.index)
'''
DatetimeIndex(['2019-01-31', '2019-02-28', '2019-03-31', '2019-04-30',
'2019-05-31', '2019-06-30'],
dtype='datetime64[ns]', freq=None)
'''
print(df.columns)
'''
Index(['c1', 'c2', 'c3', 'c4'], dtype='object')
'''
print(df[['c1', 'c2']])
# 按照index取值
print(df.loc['2019-01-31'])
'''
c1 -0.511065
c2 0.173715
c3 0.460645
c4 -0.105340
Name: 2019-01-31 00:00:00, dtype: float64
'''
# 按照values取值
print(df.iloc[0,1])
'''
-0.515215674883499
'''
df.iloc[0,:] = 0
print(df)
'''
c1 c2 c3 c4
2019-01-31 0.000000 0.000000 0.000000 0.000000
2019-02-28 -0.473829 0.647171 -1.026075 -0.630721
2019-03-31 1.112496 2.454119 -0.339265 0.600856
2019-04-30 -0.264615 -0.035386 -0.717795 0.320868
2019-05-31 -0.638794 -0.926775 0.247402 -0.824648
2019-06-30 -0.100243 -1.077409 -1.063229 -1.314213
'''