Julia:在数组数组中广播结果

5 arrays julia

这似乎足够基本,我希望有人已经问过这个问题,但我找不到。

当我以天真的方式使用广播时,当我想获得一个二维数组时,我得到了一个数组数组。例如,这个函数

function onehotencode(n, domain_size)
    return [ n == k ? 1 : 0 for k in 1:domain_size ]
end
Run Code Online (Sandbox Code Playgroud)

当我跑

onehotencode.([1,2,3,4], 10)
Run Code Online (Sandbox Code Playgroud)

我得到

4-element Array{Array{Int64,1},1}:
 [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
 [0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
 [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
 [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
Run Code Online (Sandbox Code Playgroud)

相反,我想得到

4x10 Array{Int64,2}:
 1 0 0 0 0 0 0 0 0 0
 0 1 0 0 0 0 0 0 0 0
 0 0 1 0 0 0 0 0 0 0
 0 0 0 1 0 0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)

Bog*_*ski 4

您的函数返回向量,因此它们被收集为向量的向量。要么写:

\n\n
permutedims(reduce(hcat, onehotencode.([1,2,3,4], 10)))\n
Run Code Online (Sandbox Code Playgroud)\n\n

它重用你的代码并得到你想要的东西(但不是很有效),或者简单地写:

\n\n
.==([1,2,3,4], (1:10)\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者

\n\n
.==([1,2,3,4], hcat(1:10...))\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果你想得到一个Int(不是Bool),那么就写Int.(.==([1,2,3,4], hcat(1:10...)))。

\n\n

==可以替换为您选择的任何适用于标量的函数函数,例如:

\n\n
julia> f(x,y) = (x,y)\nf (generic function with 1 method)\n\njulia> f.([1,2,3,4], hcat(1:10...))\n4\xc3\x9710 Array{Tuple{Int64,Int64},2}:\n (1, 1)  (1, 2)  (1, 3)  (1, 4)  (1, 5)  (1, 6)  (1, 7)  (1, 8)  (1, 9)  (1, 10)\n (2, 1)  (2, 2)  (2, 3)  (2, 4)  (2, 5)  (2, 6)  (2, 7)  (2, 8)  (2, 9)  (2, 10)\n (3, 1)  (3, 2)  (3, 3)  (3, 4)  (3, 5)  (3, 6)  (3, 7)  (3, 8)  (3, 9)  (3, 10)\n (4, 1)  (4, 2)  (4, 3)  (4, 4)  (4, 5)  (4, 6)  (4, 7)  (4, 8)  (4, 9)  (4, 10)\n
Run Code Online (Sandbox Code Playgroud)\n\n

一般来说,我发现在 Julia 实践中有用的规则是编写对标量起作用的函数,然后使用广播或该语言的其他高阶组件来处理它们。

\n\n

编辑

\n\n

您的函数接受标量,但实际上在内部扩展它们并返回一个Vector. 所以从概念上讲,你的函数是这样的:

\n\n
function onehotencode(n, domain_range)\n    return [ n == k ? 1 : 0 for k in domain_range]\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

尽管它是隐藏的,因为您传递了一个标量。因此,您可以编写onehotencode.([1,2,3,4], hcat(1:10...))自己的onehotencode实现,但返回值被视为结果单元格中的条目Matrix(这显然不是您想要的)。

\n\n

如果您将函数定义为:

\n\n
function onehotencode(n, v)\n    return n == v ? 1 : 0\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

即获取标量并返回标量(或更准确地说,在预期结果中返回“单个条目” Matrix,因为从技术上讲它不必是标量),然后一切按预期工作:

\n\n
julia> onehotencode.([1,2,3,4], hcat(1:10...))\n4\xc3\x9710 Array{Int64,2}:\n 1  0  0  0  0  0  0  0  0  0\n 0  1  0  0  0  0  0  0  0  0\n 0  0  1  0  0  0  0  0  0  0\n 0  0  0  1  0  0  0  0  0  0\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,总而言之,该函数应该:获取标量作为参数并返回标量(标量这个词再次是一种简化 - 在参数和返回值中,它们可以是被视为单个条目的任何内容 - 在这两种情况下,简单的标量都是最常见的用例)。

\n