可以說我將有兩個陣列。第一行將指定時間戳,第二行將是資料。
timeStamp = ['0001','0002','0003',...,'9999']
data = [6234,2372,1251,...,5172]
存盤它們的最佳方式是什么?假設我想將資料從最小到更大的數字進行排序,同時保持它們的時間戳值附加到它們上面?
uj5u.com熱心網友回復:
有多種方法可以做到這一點。讓我們獲取以下資料 -
timeStamp = [9,1,2,3,9999]
data = [1245, 6234,2372,1251,5172]
使用基礎 python 和 zip
處理資料的默認方式,特別是串列。zip方法允許您按元素壓縮兩個或多個串列,創建一個元組串列。然后sorted,您可以使用lamda 函式,該函式按元素的特定位置對組合串列進行排序。
l = zip(timeStamp, data) #storing 2 arrays by attaching them elementwise
print(sorted(l, key=lambda x: x[0]))
[(1, 6234), (2, 2372), (3, 1251), (9, 1245), (9999, 5172)]
使用 numpy 和 argsort
Numpy 允許您使用多維陣列。對于 2 個串列,您可以簡單地將np.stack它們一起創建一個 2D 陣列。
為了排序,您可以argsort()在第一列(時間戳)上使用,它回傳已排序的有序列的索引。然后,您可以使用這些索引來索引原始二維陣列,以按時間戳獲取陣列的排序順序。
arr = np.stack([timeStamp, data])
arr[:,arr[0].argsort()]
array([[ 1, 2, 3, 9, 9999],
[6234, 2372, 1251, 1245, 5172]])
使用 pandas datafames 和 sort_values
最后,同時處理多個串列的最佳方法是將它們視為 DataFrame 中的列。Pandas 提供了一個方便的框架來處理列/行排列的資料,在這種情況下非常有用,因為您還可以使用列名來標識每個陣列/列。
將sort_values讓你快速排序基于列名的完整資料。
import pandas as pd
df = pd.DataFrame(zip(timeStamp, data), columns=['timeStamp','data'])
print(df.sort_values('timeStamp'))
timeStamp data
1 1 6234
2 2 2372
3 3 1251
0 9 1245
4 9999 5172
uj5u.com熱心網友回復:
您可以使用二維陣列。您可以使用
timestamp_data = [ [timeStamp[i], data[i]] for i in range(len(timeStamp)) ]
現在,您可以使用
sorted_timestamp_data = sorted(timestamp_data, key=lambda row: row[1])
uj5u.com熱心網友回復:
字典對你來說非常有用。您可以zip data然后timeStamp排序,data然后將元組轉換為dict(字典保留插入順序)。然后您將擁有資料-時間戳對,其中資料是鍵,時間戳是值。
out = dict(sorted(zip(data, timeStamp)))
輸出:
{1251: '0003', 2372: '0002', 5172: '9999', 6234: '0001'}
如果您想要 2 個單獨的串列,則可以執行以下操作。不要強制轉換為 dict 建構式,而是解壓到串列:
data[:], timeStamp[:] = zip(*sorted(zip(data,timeStamp)))
輸出:
[1251, 2372, 5172, 6234], ['0003', '0002', '9999', '0001']
uj5u.com熱心網友回復:
取決于你想如何使用它。如果您不想使用其他庫,我會使用類似的東西
result = sorted(({"timestamp": ts, "data": data} for ts, data in zip(timeStamp, data)), key=lambda d:d["data"]
這基本上是按資料排序的字典串列。我會選擇字典串列,因為它比元組串列更具表現力。
uj5u.com熱心網友回復:
要按照您描述的方式組織資料,您可以簡單地執行以下操作:
sorted(zip(timeStamp, data), key=lambda x: x[1])
或者
from operator import itemgetter
sorted(zip(timeStamp, data), key=itemgetter(1))
要存盤這個物件,你可以pickle,這里有一個很好的描述。顯然,有很多選項可以存盤它。
uj5u.com熱心網友回復:
嗯,這很簡單
records = list(zip(data, timeStamp))
排序:
records.sort()
在 Python 中,元組是從左到右逐元素比較的,因此在這種情況下不需要提供 key 函式。而已。正如在一些評論中那樣,沒有必要讓它過于復雜。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/407313.html
標籤:
