天天看點

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

自從2014年Wolfram語言第10版中引入Association以來,它已經成為開發者處理任何一種資料的最常用的符号之一。雖然有許多内置的工具來處理關聯,但開發者在現代化代碼的過程中也自己制作了許多工具。現在,這些工具中有許多已經進入了Wolfram函數庫。在這裡,我将強調我最喜歡的一些工具,并展示它們與 Wolfram 語言内置函數的比較。

建構

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

Association 存儲鍵值資料。有許多 Wolfram Language 函數用于建立Association,包括 AssociationMap, AssociationThread, Counts 和 GroupBy。函數庫還包括幾個用于建立新關聯的函數。

你可以直接在規則清單上使用Association來轉換它,但它隻在頂層起作用。ToAssociations也可以轉換表達式深處的規則清單。

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

AssociationMap通過在一個清單上映射一個函數來建立一個關聯,使用清單中的元素作為鍵,輸出作為值。AssociationThrough的做法則相反。它在一個單一的值上映射幾個函數。

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

SparseArray是一種存儲稀疏數字數組的有效方法。數值是以數字為索引的。SparseAssociation将這一概念廣義為Association,是以,值是用鍵來索引的。

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

它像Association一樣運作:

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

而且,對于沒有明确給出的鍵,它給出的值是0:

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

因為這些值沒有被存儲在SparseAssociation中,是以當有很多預設值時,它會更小:

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

修改Associations

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

Associations可以使用許多标準的 Wolfram 語言符号進行修改,如 Map、KeyMap、MapAt 和 Set。然而,資料科學家想要操作他們的資料的函數數量是無限的,是以他們創造了一些自己的函數。下面是一些已經釋出在函數庫中的函數。

MapAt可以對Association中特定鍵的值應用一個函數,而MapAtKey可以對不同的鍵應用不同的函數。

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

KeyCombine是Merge和KeyMap的組合,它允許你根據鍵來組合Association的元素:

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

使用KeyMap會導緻數值丢失:

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

keyCombine保留了一個清單中的所有值:

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

在筆記本中手動編輯Association的内容可能是一個挑戰。AssociationEditor為編輯内容提供了一個友善的 GUI 形式。我在下面的例子中修改了 Bob 的值,并使用列印按鈕列印出更新的Association:

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

嵌套Associations

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

在一個Association中,鍵可以是任何表達式,包括清單。這個特性的副作用是,通常不能用清單來指定嵌套關聯内部的位置。幾個函數庫的函數已經釋出,專門幫助處理嵌套關聯。

NestedLookup 将清單視為嵌套關聯中的一個索引:

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

它還可以處理任何級别的缺失值:

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

NestedAssociate 在一個嵌套的Association中增加或修改深層的值:

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

NestedKeyDrop将鍵值對從嵌套Assocation的深處移除:

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

AssociationMapAt在一個嵌套的Association中深層映射一個函數:

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

AssociationKeyFlatten将一個嵌套的Association轉換為一個平面的Association:

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

AssociationKeyDeflatten做的是相反的操作*。它從一個以清單為鍵的展平的Association中建立一個嵌套Association:

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

* 我們認為 "flatten (扁平化)"的反義詞可能是 "sharpen (銳化)",但我們為這個作為資源功能部署在我的雲賬戶中的極端資料科學功能保留了AssociationSharpen (https://www.wolframcloud.com/obj/bobs/DeployedResources/Function/AssociationSharpen) 這個名字。

現代化

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

函數Counts可以被認為是對舊函數Tally的現代化改造。

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

同樣,其他早于Association的函數在函數庫中也被現代化了。現在有兩種方法來擷取:

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

BinCounts将資料分割成接收器,并給你每個接收器中的項目數,但不傳回實際的接收器。BinCountAssociation使用Association的鍵來在結果中包含該資訊。

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

互操作性

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

Wolfram 語言和 Wolfram 函數庫的最後一個重要方面是,所有函數之間的一緻性和互操作性。使用一個開發者在函數庫中建立的函數并不意味着你必須建立轉換器或翻譯器來使用庫中或 Wolfram 語言中的其他函數。為了說明這一點,這裡有一個大的毫無意義的基于Association的操作,将前面讨論過的大部分函數(以及更多)無縫地放在一起使用。雖然結果毫無意義,但眼前的相容性卻讓人感到溫暖。

可在Wolfram函數庫中使用更強大的Association(關聯)資料工具
可在Wolfram函數庫中使用更強大的Association(關聯)資料工具

這裡提到的函數隻是函數庫中的一些Association工具,而這些工具又隻是完整庫中持續增長的一小部分。每周都會有新的函數加入,這些函數既擴充了 Wolfram 語言,又填補了其中的一些空白。不再需要等待Wolfram語言版本的釋出,就可以看到最新和最偉大的新功能:你可以在這裡 (https://resources.wolframcloud.com/FunctionRepository/) 随時得到它們。