Python之數據分析(間接聯合排序、所有最值相關函數、有序插入、定積分、插值器物件)

2020-08-11 22:41:00

一、間接聯合排序

1、間接聯合排序: 獲取排序樣本的下標後來排序0 1 2 3 4 5 6 7 8
原始序列:8 2 3 1 7 4 6 5 9
直接排序:1 2 3 4 5 6 7 8 9
間接排序:3 1 2 5 7 6 4 0 8

2、使用方法

  • numpy.lexsort((參考序列, 待排序列))
    返回索引序列
  • np.sort_complex(A)
    複數的排序,按照實部進行排,實部相同看虛部

3、練習程式碼

import numpy as np

names = np.array(['李一', '劉二', '王三', '趙四', '姚五'])  # 存放姓名
scores = np.array([90, 70, 50, 80, 60])  # 存放分數
ages = np.array([10, 20, 20, 40, 50])  # 存放年齡

# 按照年齡升序排,年齡相同的參考分數排,最後輸出他們的姓名
print(names[np.lexsort((scores, ages))])

# 對複數進行排序:複數是按照實部進行排序的
c = ages + scores * 1j  # 得到複數陣列:用年齡當實部,分數乘單位向量當虛部
d = np.sort_complex(c)
print(d)

联合排序

二、所有最值相關方法

1、成對最大值最小值

  • max/min
  • argmax/argmin
  • nanmax/nanmin
  • nanargmax/nanargmin

2、nan解釋

  • max:最大值
  • min:最小值
  • arg:間接,取下標
  • nan:忽略無效值求最值

3、練習程式碼

import numpy as np

a = np.array([1, 2, np.nan, 4, 5])
print(np.max(a), np.min(a))  # nan既是最大值也是最小值
print(np.argmax(a), np.argmin(a))  # 取最值的下標(索引)
print(np.nanmax(a), np.nanmin(a))  # 忽略無效值的最值
print(np.nanargmax(a), np.nanargmin(a))  # 忽略無效值的最值下標

最值

三、有序插入

1、引入
有序序列:[1, 2, 4, 5, 7, 8, 10]
被插序列:[6, 3]

2、呼叫方法

  • numpy.searchsorted(有序序列, 被插序列)
    返回插入的位置
  • numpy.insert(有序序列, 插入位置, 被插序列)
    直接插入,返回插入結果

3、練習程式碼

import numpy as np

a = np.array([1, 2, 4, 5, 7, 8, 10])
b = np.array([6, 3])
c = np.searchsorted(a, b)  # 達到b有序插入在a後的位置下標
print(c)

# 直接插入
d = np.insert(a, c, b)  # 將b按照c的位置序列插入到a中
print(d)

有序插入

四、定積分

1、匯入庫: import scipy.integrate as si

2、存原函數:
def f(x):
y = …x…
return y

3、上下限: a, b = __, __

4、求定積分: si.quad(f, a, b)[0]
返回的結果是定積分值

五、插值器物件

1、用處: 用於樣本非常少,但又希望曲線足夠平滑的時候。

2、使用步驟
1)import scipy.interpolate as si

2)si.interp1d(離散樣本水平座標, 離散樣本垂直座標, kind=‘插值器種類’)

返回一個一維插值器物件;
注意:p1d中間的是數位1,插值器種類預設的線性插值器
然後將該插值器物件當做函數去執行,傳入參數:插值樣本的水平座標
最後會得到插值樣本的垂直座標

3、插值器案例(樣本極少)

import numpy as np
import scipy.interpolate as si
import matplotlib.pylab as mp

min_x, max_x = -2.5, 2.5  # 標記水平座標最值

# 連續曲線
con_x = np.linspace(min_x, max_x, 1001)  # 生成1000個原始資訊
con_y = np.sinc(con_x)

# 離散曲線
dis_x = np.linspace(min_x, max_x, 11)
dis_y = np.sinc(dis_x)

# 線性插值器:將散點連線起來
linear = si.interp1d(dis_x, dis_y)  # 建立線性插值器
lin_x = np.linspace(min_x, max_x, 51)  # 插值橫座標
lin_y = linear(lin_x)

# 樣條插值器
cubic = si.interp1d(dis_x, dis_y, kind='cubic')  # 需要加一個kind參數,因爲預設是線性的
cub_x = np.linspace(min_x, max_x, 51)
cub_y = cubic(cub_x)

# 繪製連續曲線
mp.figure('Interpolation', facecolor='lightgray')
mp.subplot(2, 2, 1)
mp.title('Continuous', fontsize=16)
mp.ylabel('y', fontsize=12)
mp.tick_params(labelsize=10)
mp.plot(con_x, con_y, c='limegreen', label='Continuous')
mp.legend()

# 繪製離散樣本曲線
mp.subplot(2, 2, 2)
mp.title('Discrete', fontsize=16)
mp.ylabel('y', fontsize=12)
mp.tick_params(labelsize=10)
# mp.plot(dis_x, dis_y, c='dodgerblue', label='Discrete')
mp.scatter(dis_x, dis_y, c='dodgerblue', label='Discrete')  # 散點圖
mp.legend()

# 線性插值樣本圖(連線散點)
mp.subplot(2, 2, 3)
mp.title('Linear', fontsize=16)
mp.xlabel('x', fontsize=12)
mp.ylabel('y', fontsize=12)
mp.tick_params(labelsize=10)
mp.plot(lin_x, lin_y, 'o-', c='orangered', label='Linear')  # 散點圖
mp.scatter(dis_x, dis_y, c='green', zorder=3)
mp.legend()

# 樣條插值器圖
mp.subplot(2, 2, 4)
mp.title('Cubic', fontsize=16)
mp.xlabel('x', fontsize=12)
mp.ylabel('y', fontsize=12)
mp.tick_params(labelsize=10)
mp.plot(cub_x, cub_y, 'o-', c='hotpink', label='Cubic')  # 散點圖
mp.scatter(dis_x, dis_y, c='blue', zorder=3)
mp.legend()

mp.tight_layout()
mp.show()

插值器对象