当对地图使用的功能具有输入数组时,对地图的使用

时间:2019-05-06 10:15:28

标签: julia

朱莉娅的“高阶”函数“地图”看起来非常有用。但是,虽然很容易理解如何在具有一个输入的函数上使用它,但是当函数具有多个输入以及每个输入可能是数组时,如何使用map并不清楚。我想了解在这种情况下如何使用地图。

假设我具有以下功能:

function randomSample(items, weights)
sample(items, Weights(weights))
end

示例:

Pkg.add("StatsBase")
using StatsBase
randomSample([1,0],[0.5, 0.5])

如何在这里使用地图?我已经尝试过类似的东西:

items = [1 0;1 0;1 0]
weights = [1 0;0.5 0.5;0.75 0.25]

map(randomSample(items,weights))  

在上面的示例中,我希望朱莉娅输出3 x 1的整数数组(来自项),每行根据对应的权重为0或1。

1 个答案:

答案 0 :(得分:3)

itemsweightsMatrix的情况下,您可以使用eachrow函数,如下所示:

map(randomSample, eachrow(items), eachrow(weights))

如果您使用的Julia版本早于1.1,则可以编写:

map(i -> randomSample(items[i, :], weights[i, :]), axes(items, 1))

map(i -> randomSample(view(items,i, :), view(weights, i, :)), axes(items, 1))

(后者避免分配)

但是,实际上,我可能会将itemsweights定义为向量的向量:

items = [[1, 0],[1, 0],[1, 0]]
weights = [[1, 0], [0.5, 0.5], [0.75, 0.25]]

然后您可以简单地写:

map(randomSample, items, weights)

randomSample.(items, weights)

我偏爱的原因如下:

  • 从概念上讲,数据的结构是什么
  • vector的vector易于突变(例如,您可以在末尾push!新建一个条目)
  • 如果需要,
  • 向量的向量可能会参差不齐
  • 在某些情况下,它可能会更快一些(在Julia中按行进行迭代不是最佳方法,因为它使用列优先索引);当然,您可以通过假设Matrix来解决问题,方法是假设您存储了数据按列而不是像您当前所做的那样逐行排列)

(这不是一个很强的偏好,您可能可以选择对您而言更方便的任何方式)