我有一个具体的数组,并希望有效地构建一个填充了 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)
关于什么:
ones(Int, size(A))
Run Code Online (Sandbox Code Playgroud)
或者
fill(1, size(A))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
50 次 |
| 最近记录: |