簡體   English   中英

在 python 中表示非均勻數據集的內存有效方式

[英]Memory-efficient way of representing non-uniform datasets in python

我想以一種很好的方式存儲我的數據,以便以后可以使用標准包(例如 seaborn)有效地分析/繪制它。 Pandas 似乎是用於存儲結構化數據的庫的 go。 但是,我找不到令人滿意的方法來使用它來存儲非均勻數據。

假設我有 3 個 arrays,代表 100 只老鼠、1000 只貓和 200 只狗的長度。

ratLength = np.random.uniform(1, 2, 100)
catLength = np.random.uniform(2, 3, 1000)
dogLength = np.random.uniform(3, 4, 200)

據我了解,我有 2 個選項可以將此類數據存儲在 Pandas dataframe

  1. 每只動物一排。 第一列是動物種類(大鼠/貓/狗),第二列是長度。
  2. 鼠貓狗三胞胎一排。 在這種情況下,我將不得不用 np.nan 填充較短的np.nan以便它們的長度相同

在這兩種情況下,存儲結構都迫使我顯着增加數據集的 memory 占用空間。 我想人們可以用更復雜的數據集構建更多的病態例子。

問題:您能否推薦一個用於 python 的框架,以有效地處理非均勻數據集。 它可以是使用 Pandas 的更智能方式,也可以是不同的數據存儲庫,我都可以。

除了我的評論(寫評論太長):

s = pd.Series()
rat = np.random.uniform(1, 2, 100)
cat = np.random.uniform(2, 3, 1000)
dog = np.random.uniform(3, 4, 200)
s['rat'] = rat
s['cat'] = cat
s['dog'] = dog
s.memory_usage(deep=True)
#10892
s.memory_usage(deep=True, index=False)
#10712
sum(map(sys.getsizeof, (cat,rat,dog)))
#10688

所以額外的 memory 要求是 180 B 的索引和 24 B 的系列開銷。


您還可以以長格式存儲數據(我認為這就是您在評論中的意思)。 在這種情況下,您應該使用分類索引來存儲 3 而不是 1300 個字符串:

 s1 = pd.Series() s1 = s1.append(pd.Series(rat, index=['rat']*len(rat))) s1 = s1.append(pd.Series(cat, index=['cat']*len(cat))) s1 = s1.append(pd.Series(dog, index=['dog']*len(dog))) s1.memory_usage(deep=True) #88400 --> 1300 strings. BAD s1.index = pd.CategoricalIndex(s1.index) s1.memory_usage(deep=True) #11960 --> 3 categories

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM