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

标签 arrays julia

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

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

function onehotencode(n, domain_size)
    return [ n == k ? 1 : 0 for k in 1:domain_size ]
end

当我跑
onehotencode.([1,2,3,4], 10)

我得到
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]

相反,我想得到
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

最佳答案

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

permutedims(reduce(hcat, onehotencode.([1,2,3,4], 10)))

它重用您的代码并获得您想要的东西(但效率不高),或者简单地编写:
.==([1,2,3,4], (1:10)')

或者
.==([1,2,3,4], hcat(1:10...))

如果您想获得 Int (不是 Bool )然后写 Int.(.==([1,2,3,4], hcat(1:10...))) .
==可以替换为您选择的适用于标量的任何函数,例如:
julia> f(x,y) = (x,y)
f (generic function with 1 method)

julia> f.([1,2,3,4], hcat(1:10...))
4×10 Array{Tuple{Int64,Int64},2}:
 (1, 1)  (1, 2)  (1, 3)  (1, 4)  (1, 5)  (1, 6)  (1, 7)  (1, 8)  (1, 9)  (1, 10)
 (2, 1)  (2, 2)  (2, 3)  (2, 4)  (2, 5)  (2, 6)  (2, 7)  (2, 8)  (2, 9)  (2, 10)
 (3, 1)  (3, 2)  (3, 3)  (3, 4)  (3, 5)  (3, 6)  (3, 7)  (3, 8)  (3, 9)  (3, 10)
 (4, 1)  (4, 2)  (4, 3)  (4, 4)  (4, 5)  (4, 6)  (4, 7)  (4, 8)  (4, 9)  (4, 10)

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

编辑

您的函数采用标量,但实际上在内部扩展它们并返回 Vector .所以从概念上讲,您的功能类似于:
function onehotencode(n, domain_range)
    return [ n == k ? 1 : 0 for k in domain_range]
end

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

如果您将函数定义为:
function onehotencode(n, v)
    return n == v ? 1 : 0
end

即采用标量并返回标量(或更准确地说,在预期结果 Matrix 中返回“单个条目”,因为技术上它不必是标量)然后一切都按预期工作:
julia> onehotencode.([1,2,3,4], hcat(1:10...))
4×10 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

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

关于arrays - Julia:在数组数组中广播结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57235213/

相关文章:

javascript - 操作 jQuery 元素时 `array.join` 优于字符串连接的好处?

javascript - 数组的随机排序

arrays - Excel VBA - redim arr 时类型不匹配

printf - 在 Julia 中重复格式字符串的正确方法是什么?

julia - Julia 中的参数仿函数

machine-learning - 与尺寸的点积误差

java - 数组消失了?

c - 数组中的疑问并重新定义其大小

arrays - 空数组的 Julia 数组

DataFrames.jl 行数