快速初始化一个空数组,使其大小与另一个数组相同的Julia方法是什么?

5

我有一个数组

array1 = Array{Int,2}(undef, 2, 3)

有没有一种快速创建与第一个数组大小相同的新数组的方法?例如,类似于:

array2 = Array{Int,2}(undef, size(array1))

目前我必须这样做,这相当繁琐,对于更高维度的数组来说更加糟糕。

array2 = Array{Int,2}(undef, size(array1)[1], size(array1)[2])

最好的解决方案是“相似”,但你没有尝试过自己的建议吗?Array{Int,2}(undef, size(array1))可以完美地工作! - DNF
它能工作,但你必须要打很多字。如果你正在使用需要预先分配的多维数组,那就是非常非常多了哈哈。 - Hansang
不,我的意思是 Array{Int,2}(undef, size(array1)) 是可行的,而你说它不行。它适用于所有维度。 - DNF
啊,我的意思是 Array{Int}(undef, size(array1))。好的,现在我看到问题了:类型参数里面有数字2。把它去掉就可以了。 - DNF
2个回答

7
你需要的是 similar(array1)
你甚至可以通过传递类型更改数组类型,例如:
similar(array1, Float64)
similar(array1, Int64)

1
很高兴能帮忙!它也适用于结构化数组,即 similar(sparseMatrix) 具有相同的稀疏模式。 - Oscar Smith
我也意识到你可以改变similar()数组的类型!将编辑你的回答。 - Hansang
1
你也可以保留类型并更改大小。 - DNF

2

使用 similar 是一个很好的解决方案。但是你原来的尝试之所以不起作用,是因为类型参数签名中的数字2:Array{Int, 2}。数字2指定数组必须有2个维度。如果你去掉它,你就可以有任意多个维度:

julia> a = rand(2,4,3,2);

julia> b = Array{Int}(undef, size(a));

julia> size(b)
(2, 4, 3, 2)

这同样适用于其他数组构造函数:
zeros(size(a))
ones(size(a))
fill(5, size(a))
# etc.

啊,我明白了,这也很有道理!我想两种方法都是同样有效的,这种方法更加明确你所要求的内容,对读者来说可能更清晰。 - Hansang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接