朱莉娅矩阵转置向量。

4

我有一个向量的向量,比如:

julia> m=[[1,2],[3,4],[5,6]]
3-element Vector{Vector{Int64}}:
 [1, 2]
 [3, 4]
 [5, 6]

我想要转置,也就是说我想要一个2维向量和对应的3维向量(1,3,5 和 2,4,6)。
这显然可以通过循环来完成,但我怀疑这会很慢,并且相信Julia有更好的解决方案。迄今为止,我能想到的最好的方法如下:
julia> matrixM=reshape(collect(Iterators.flatten(m)), (size(m[1],1),size(m,1)))
2×3 Matrix{Int64}:
 1  3  5
 2  4  6

julia> map(i->matrixM[i,:], 1:size(matrixM,1))
2-element Vector{Vector{Int64}}:
 [1, 3, 5]
 [2, 4, 6]

循环在Julia中非常快。如果您需要最佳性能,循环几乎总是答案。 - DNF
3个回答

6

您可以使用:

julia> using SplitApplyCombine

julia> invert([[1,2],[3,4],[5,6]])
2-element Vector{Vector{Int64}}:
 [1, 3, 5]
 [2, 4, 6]

1
这正好做到了我想要的,但也只使用了for循环。我很难相信在性能方面没有更好的解决方案;如果没有人提出更好的解决方案,我会相信你的。 - MetaColon
1
什么样的可能解决方案不会在某个层面上归结为仅使用循环? - StefanKarpinski

0
如果内部向量只有两个条目,则可以使用以下代码:
m = [[1,2], [3,4], [5,6]]
[first.(m), last.(m)]

输出:

2-element Vector{Vector{Int64}}:
 [1, 3, 5]
 [2, 4, 6]

-1
一个类似于Python的zip方法的实现方式。
m = [[1,2], [3,4], [5,6]]
[zip(m...)...]

输出:

2-element Vector{Tuple{Int64, Int64, Int64}}:
 (1, 3, 5)
 (2, 4, 6)

然而,对于100个元素来说,它似乎很慢,对于1000个元素,我的jupyter-lab内核甚至会重新启动。
(这是留在Python的另一个原因。)


当然会慢。你正在创建长度为1000的元组,编译器必须为此专门编写代码,这会使其不堪重负。元组适用于小集合,而展开运算符最适用于静态已知长度。你找到了一个极其低效的解决方案,然后抱怨是语言的问题? - DNF
问题不在于 zip,而在于 splat。对动态大小的容器进行展开,并创建动态大小和巨大的元组将会很慢,这是众所周知的。我对你的回答投下了反对票。主要原因不是解决方案本身,而是因为那个任性的俏皮话。 - DNF

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