【发布时间】:2018-09-02 06:47:51
【问题描述】:
假设我想编写一个需要任意长度的数组作为参数输入的函数: 例如,
f = function(x,y)
z = x * y
outputs = DataFrame(x = x, y = y, z = z)
return(outputs)
end
返回 f.([1,2],[1,2]) 是两个 1x3 DataFrame 的 2 元素数组。但是,在这种情况下,我想要一个 2x3 DataFrame。
我可以通过在嵌套 for 循环之前定义 z 来实现这一点:
f = function(x,y)
z=fill(0,length(x))
for i in 1:length(x)
z[i] = x[i] * y[i]
end
outputs = DataFrame(x = x, y = y, z = z)
return(outputs)
end
在这里,f([1,2],[1, 2]) 得到了我想要的。但是,问题是我必须定义所有函数内变量两次并添加一个 for 循环,同时记住包含迭代变量 i。有什么我想念的吗?我的问题是,我如何获得我想要的 nm 元素而不是 nm 数组...
我试图关注这个Julia blog post。 this Julia discussion post 也专门解决了这个问题,但我认为解决方案对于 1.0 来说已经过时了。
---- 编辑
使用 for 循环可以像使用点来表示元素操作一样工作。
我关心的更大的问题是一致性。
假设我有两个功能。一个函数 (f1) 返回一维输出,而另一个 (f2) 具有二维输出。
function f1(x, y)
z = x .* y
DataFrame(x = x, y = y, z = z)
end
function f2(x, y)
z = x * y
return(z)
end
x = [1,2] 和 y = [1,2] 的正确调用是 f1([1,2], [1,2]) 和 f2.([1,2], [1,2])。
我在这里所说的不一致的是(从不知道内部功能代码的用户的角度来看),要获得z 是x 和y 的长度的输出, . 与f2 一起使用,但不是f1。我能看到的唯一解决方法是在f2 中定义z = .x * y(或者为每个索引循环使用一个)。在这种情况下,f1 和 f2 都可以在没有点的情况下调用。这是一个合适的解决方案吗?需要明确的是,我的目标是f1 和f2 被用户以相同的方式调用,无论x 和y 是单元素数组还是多元素数组。如果x 和y 是单个元素并且. 如果每个变量都有多个元素,我的偏好是让用户调用两个函数而不使用点。这似乎不可能。因此,我必须学会忍受的部分是必须在我的函数中编写许多. 或[i](如果我想要“一致性”)。对吗?
或者,我可以添加文档,明确说明返回一个变量的函数需要在参数长度>1 时使用. 调用,而对于任何返回数据帧的函数都不需要使用. 调用原因。
[原谅对技术语言的任何滥用;我的背景是生态学]
【问题讨论】:
-
这在 Julia 中称为 broadcasting,而不是循环融合。你可以编辑你的标题,让读者更清楚。
-
@Justin 你可以为此使用多个调度吗? docs.julialang.org/en/v1/manual/methods/index.html
-
我最终使用了多次调度。我不知道这个功能。非常感谢。
标签: arrays dataframe scope julia