一、常規定義
1、np.cumsum可以對輸入數組的元素進行累加操作,返回一個由累加值組成的新數組。
2、沿着指定軸的元素進行 sum 操作。對於類型為float的數組,數值累加可能會導致精度損失。對於保持精度的求和,使用cumsum。
3、cumsum(a, dtype=float)的累加器保持所需的精度。類型由a決定。a的類型不能改變。如果a的類型為int,那麼累加器的類型會是np.int32或np.int64(取決於平台),而對於其他類型,它們會如上述。
import numpy as np
a = np.array([1,2,3])
print(np.cumsum(a)) #[1, 3, 6]
b = np.array([(1,2,3),(4,5,6)])
print(np.cumsum(b, axis=0)) #[[1,2,3], [5,7,9]])
print(np.cumsum(b, axis=1)) #[[1,3,6], [4,9,15]]
二、利用np.cumsum做滑動平均
1、在濾波器設計中,將其作為模擬器,以近似系統函數或信號的衰減速度的方法使用cumsum。
2、累加之後計算平均,這是一種用於計算數據序列的平均值的技術。例如,在時間序列數據中可以將np.cumsum與np.arange結合使用,以計算數據的滑動平均值。
def moving_average(a, n=3) :
ret = np.cumsum(a, dtype=float)
ret[n:] = ret[n:] - ret[:-n]
return ret[n - 1:] / n
a = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
print(moving_average(a, n=3)) #[ 2. 3. 4.]
三、用np.cumsum實現分組且分組後每組內部求和
1、可以用np.cumsum實現下面的操作:對輸入數組劃分為幾段,每段內部元素求和後輸出。
2、我們可以通過先計算原始數組的累計總和,並將每個段開頭偏移一定數量的元素,獲得每個分段的求和結果。
def segment_sum(a, L):
# 求得每個分塊的頭和尾位置
limits = list(range(0, len(a), L)) + [len(a)]
# 依次對相鄰分塊累加求和,np.diff得到每個分塊累加和
sums = [np.cumsum(a[limits[i]:limits[i+1]]) for i in range(len(limits) - 1)]
return np.concatenate(sums)
a = np.array([1,2,3,4,5,6,7,8,9])
print(segment_sum(a, 3)) #[6, 15, 24, 17]
四、利用np.cumsum實現局部最小值/最大值的檢測
1、通過計算差異值並使用布爾掩碼,可以輕鬆地從數據點中識別出局部最小值或局部最大值。
2、該方法基於以下性質:如果當前值小於其相鄰值,則當前值在局部最小值上,相反,如果當前值大於其相鄰值,則當前值在局部最大值上。
def local_minmax(a):
# 計算如果是局部最小值/最大值則差異值的正負符號
diff = np.diff(a)
# 獲得布爾掩碼,其中差異為正則表示其在局部最大值上,反之在局部最小值上
mask = np.concatenate(([False], diff[:-1] * diff[1:] < 0, [False]))
# 返回局部最小值和局部最大值的點 Vales
if not mask.any():
return np.array([], dtype=int), np.array([], dtype=int)
else:
extrema = np.where(mask)[0]
return extrema, a[extrema]
a = np.array([1,3,2,4,3,5,4,6,7,8,6,3,4,2])
minima_idx, minima_val = local_minmax(a)
print(minima_idx, minima_val) # [1 , 2, 3, 4, 6, 11 , 13] [ 3 2 3 4 4 3 2]
原創文章,作者:LFHNB,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/331787.html