我有一個由連續值組組成的 NumPy 陣列,我想檢測每組的中值(或最接近的整數)。之后,我應該通過減去和添加一些值來創建新陣列。
示例:資料=[100,101,102,103,170,171,172,252,253,254,255,256,333,334,335]
要求:
第一個的中值(最接近中值):103,
秒的中值:171,
第三個的中值:254,
第四的中值:334
我想減去和加上這些數字的相同值,比方說 20:
final_array =[(83,123), (151,191), (234,274), (314, 354)]
它不應該是中值,而應該是子串列中的數字。我如何使用 python 來做到這一點?
提前致謝...
uj5u.com熱心網友回復:
你可以這樣做:
首先讓我們將主陣列拆分為連續的子陣列:
splitted_data = np.array(np.split(data, np.where(np.diff(data) != 1)[0] 1), dtype=object)
本質上,我們正在搜索陣列where,兩個數字之間的差值不是 1,如果滿足條件就可以splits了。
最后的1后 當然可以,如果你正在尋找不同的差異序列被改變。
現在因為spillted_data是np.array具有不同形狀的物件,所以np.median不能“按原樣”作業,所以讓np.vectorize該方法:
vectorized_med = np.vectorize(np.median)
然后只需使用矢量化函式提取中值并將其四舍五入以匹配最接近的int要求:
medians = np.round(vectorized_med(splitted_data))
現在,您可以使用串列推導式構建最終陣列:
num = 20
final_array = np.array([(i - num, i num) for i in medians])
最終輸出:
array([[ 82., 122.],
[151., 191.],
[234., 274.],
[314., 354.]])
*作為旁注, 的中位數[100, 101, 102, 103]是101.5。
uj5u.com熱心網友回復:
作為替代解決方案(避免np.vectorize)
import numpy as np
data=np.array([100,101,102,103,170,171,172,252,253,254,255,256,333,334,335])
ddiff = np.diff(data)
#split data
subArrays = np.split(data, np.where(ddiff != 1)[0] 1)
c_val = 20
medians = []
extremes = []
for subArray in subArrays:
medians.append(np.round(np.median(subArray)).astype(int))
extremes.append((medians[-1] - c_val, medians[-1] c_val))
print(extremes)
#outputs
# [(82, 122), (151, 191), (234, 274), (314, 354)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/359769.html
上一篇:我該如何解決?[復制]
