Julia:1 的数组:加一到零还是重复?

Pat*_*ckT 4 julia

我有一个具体的数组,并希望有效地构建一个填充了 1 的相同维度的类似数组。推荐的方法是什么?

这是一个可以使用的随机数组:

julia> A = rand(0:1, 10, 5)
10×5 Matrix{Int64}:
Run Code Online (Sandbox Code Playgroud)

A = rand(0:1., 10, 5)(在0.和/或上有一个点1.)用于浮点数的随机矩阵。

两种方法都很自然。我可以这样做:

julia> zero(A) .+ 1
5×10 Matrix{Int64}:
Run Code Online (Sandbox Code Playgroud)

或者我可以这样做:

julia> repeat(ones(size(A)[2])', outer = size(A)[1])
5×10 Matrix{Float64}:
Run Code Online (Sandbox Code Playgroud)

第一种方法更优雅。第二种方法感觉更笨拙并且容易出错(不小心交换了[1][2]),但同时它不涉及加法操作,因此可能涉及较少的分配(或者可能不是因为编译器非常聪明编辑:下面的快速基准测试表明编译器非常聪明)。

当然,可能还有另一种更好的方法。

using BenchmarkTools
A = rand(0:1, 1000, 1000)

@btime zero(A) .+ 1
## 1.609 ms (6 allocations: 15.26 MiB)

@btime repeat(ones(size(A)[2])', outer = size(A)[1])
## 3.032 ms (10 allocations: 7.64 MiB)
Run Code Online (Sandbox Code Playgroud)

编辑 2:跟进 onBogumi?的回答

J为方便起见,定义了 unit-array 的以下方法是有效的:

function J(A::AbstractArray{T,N}) where {T,N}
    ones(T, size(A))
end
J(A)
@btime J(A)
## 789.929 ?s (2 allocations: 7.63 MiB)
Run Code Online (Sandbox Code Playgroud)

Bog*_*ski 5

关于什么:

ones(Int, size(A))
Run Code Online (Sandbox Code Playgroud)

或者

fill(1, size(A))
Run Code Online (Sandbox Code Playgroud)