Julia 当使用映射的函数具有输入数组时,映射的使用

Julia 当使用映射的函数具有输入数组时,映射的使用,julia,Julia,朱莉娅的“高阶”函数“映射”看起来非常有用。但是,虽然很容易理解如何在具有一个输入的函数上使用map,但当函数具有多个输入,并且每个输入都可能是数组时,map如何使用并不明显。我想了解地图在这种情况下是如何使用的 假设我有以下函数: function randomSample(items, weights) sample(items, Weights(weights)) end 例子: 这里怎么用地图?我试过这样的方法: items = [1 0;1 0;1 0] weights = [1 0

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

假设我有以下函数:

function randomSample(items, weights)
sample(items, Weights(weights))
end
例子: 这里怎么用地图?我试过这样的方法:

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

map(randomSample(items,weights))  

在上面的例子中,我希望Julia输出一个3乘1的整数数组(来自项目),每行是0或1,具体取决于相应的权重。

在您的例子中,当
项目和
权重是
矩阵时,您可以像这样使用
eachrow
函数:

map(randomSample, eachrow(items), eachrow(weights))
如果您使用的是早于1.1的Julia版本,则可以编写:

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

(后者避免分配)

然而,在实践中,我可能会将
项目
权重
定义为向量的向量:

items = [[1, 0],[1, 0],[1, 0]]
weights = [[1, 0], [0.5, 0.5], [0.75, 0.25]]
然后你可以简单地写:

map(randomSample, items, weights)

我选择的原因如下:

  • 从概念上讲,您的数据结构更清晰
  • 向量的向量更容易变异(例如,您可以
    推送!
    在末尾添加一个新条目)
  • 如果需要,向量的向量可以是参差不齐的
  • 在某些情况下,它可能会快一点(在Julia中按行迭代不是最佳的,因为它使用了列主索引;当然,您可以在
    Matrix
    方法中修复它,方法是假设您按列存储数据,而不是按列存储数据)

(这不是一个很强的偏好,您可能可以选择更方便的选项)

Kaminski,使用Juliabox,我得到错误“UndevarError:eachrow not defined”。
eachrow
需要Julia 1.1。我将在答案中添加一条注释,说明在较旧版本的Julia中应该做什么。
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)