自从2014年Wolfram语言第10版中引入Association以来,它已经成为开发者处理任何一种数据的最常用的符号之一。虽然有许多内置的工具来处理关联,但开发者在现代化代码的过程中也自己制作了许多工具。现在,这些工具中有许多已经进入了Wolfram函数库。在这里,我将强调我最喜欢的一些工具,并展示它们与 Wolfram 语言内置函数的比较。
构建
Association 存储键值数据。有许多 Wolfram Language 函数用于创建Association,包括 AssociationMap, AssociationThread, Counts 和 GroupBy。函数库还包括几个用于创建新关联的函数。
你可以直接在规则列表上使用Association来转换它,但它只在顶层起作用。ToAssociations也可以转换表达式深处的规则列表。
AssociationMap通过在一个列表上映射一个函数来创建一个关联,使用列表中的元素作为键,输出作为值。AssociationThrough的做法则相反。它在一个单一的值上映射几个函数。
SparseArray是一种存储稀疏数字数组的有效方法。数值是以数字为索引的。SparseAssociation将这一概念广义为Association,因此,值是用键来索引的。
它像Association一样运作:
而且,对于没有明确给出的键,它给出的值是0:
因为这些值没有被存储在SparseAssociation中,所以当有很多默认值时,它会更小:
修改Associations
Associations可以使用许多标准的 Wolfram 语言符号进行修改,如 Map、KeyMap、MapAt 和 Set。然而,数据科学家想要操作他们的数据的函数数量是无限的,所以他们创造了一些自己的函数。下面是一些已经发布在函数库中的函数。
MapAt可以对Association中特定键的值应用一个函数,而MapAtKey可以对不同的键应用不同的函数。
KeyCombine是Merge和KeyMap的组合,它允许你根据键来组合Association的元素:
使用KeyMap会导致数值丢失:
keyCombine保留了一个列表中的所有值:
在笔记本中手动编辑Association的内容可能是一个挑战。AssociationEditor为编辑内容提供了一个方便的 GUI 形式。我在下面的例子中修改了 Bob 的值,并使用打印按钮打印出更新的Association:
嵌套Associations
在一个Association中,键可以是任何表达式,包括列表。这个特性的副作用是,通常不能用列表来指定嵌套关联内部的位置。几个函数库的函数已经发布,专门帮助处理嵌套关联。
NestedLookup 将列表视为嵌套关联中的一个索引:
它还可以处理任何级别的缺失值:
NestedAssociate 在一个嵌套的Association中增加或修改深层的值:
NestedKeyDrop将键值对从嵌套Assocation的深处移除:
AssociationMapAt在一个嵌套的Association中深层映射一个函数:
AssociationKeyFlatten将一个嵌套的Association转换为一个平面的Association:
AssociationKeyDeflatten做的是相反的操作*。它从一个以列表为键的展平的Association中创建一个嵌套Association:
* 我们认为 "flatten (扁平化)"的反义词可能是 "sharpen (锐化)",但我们为这个作为资源功能部署在我的云账户中的极端数据科学功能保留了AssociationSharpen (https://www.wolframcloud.com/obj/bobs/DeployedResources/Function/AssociationSharpen) 这个名字。
现代化
函数Counts可以被认为是对旧函数Tally的现代化改造。
同样,其他早于Association的函数在函数库中也被现代化了。现在有两种方法来获取:
BinCounts将数据分割成接收器,并给你每个接收器中的项目数,但不返回实际的接收器。BinCountAssociation使用Association的键来在结果中包含该信息。
互操作性
Wolfram 语言和 Wolfram 函数库的最后一个重要方面是,所有函数之间的一致性和互操作性。使用一个开发者在函数库中创建的函数并不意味着你必须建立转换器或翻译器来使用库中或 Wolfram 语言中的其他函数。为了说明这一点,这里有一个大的毫无意义的基于Association的操作,将前面讨论过的大部分函数(以及更多)无缝地放在一起使用。虽然结果毫无意义,但眼前的兼容性却让人感到温暖。
这里提到的函数只是函数库中的一些Association工具,而这些工具又只是完整库中持续增长的一小部分。每周都会有新的函数加入,这些函数既扩展了 Wolfram 语言,又填补了其中的一些空白。不再需要等待Wolfram语言版本的发布,就可以看到最新和最伟大的新功能:你可以在这里 (https://resources.wolframcloud.com/FunctionRepository/) 随时得到它们。