朱莉娅反转N维数组

7

在Python中,可以使用标准的[::-1]反转Numpy数组。

A = np.diag(np.arange(1,3)) 
A[::, ::-1] 
A[::-1] 
A[::-1, ::-1]

Julia不支持[::-1],而且reverse方法只适用于1D数组和仅限于1D列(而行默认为2D)。

我是否错过了其他替代方法?


4
你尝试过使用[end:-1:1]代替[::-1]吗? - spencerlyon2
6个回答

16

尝试以下方式,它与 numpy 版本本质上相同:

julia> X = rand(3,3)
3x3 Array{Float64,2}:
 0.782622  0.996359  0.335781
 0.719058  0.188848  0.985693
 0.455355  0.910717  0.870187

julia> X[end:-1:1,end:-1:1]
3x3 Array{Float64,2}:
 0.870187  0.910717  0.455355
 0.985693  0.188848  0.719058
 0.335781  0.996359  0.782622

是的,我刚看到specerlyon2的评论,它起作用了,我猜这对Matlab用户来说是很自然的事情?我在文档中找不到它。 - user3467349
@user3467349 这确实是在MATLAB中完成此操作的惯用方式。 - jub0bs
这几乎就是numpy代码所做的事情,只不过end1是隐含的,因此无论其他语言经验如何,它似乎更自然。 - IainDunning
如果你正在使用索引不为 1:length(arr) 的数组,那么你应该使用 X[end:-1:begin] - BallpointBen

6
在Julia 1.0中,要翻转一个(列)向量: 请参考此链接
julia> reverse([1, 2, 3])
3-element Array{Int64,1}:
 3
 2
 1

要反转行,只需说明您想要翻转第二个维度:
julia> reverse([1 2 3], dims=2)
1×3 Array{Int64,2}:
 3  2  1

编辑:或者您也可以使用 end:-1:1 进行反向索引,这种方法还允许您请求视图而不是副本:

julia> a = reshape(randperm(9), 3, 3)
3×3 Matrix{Int64}:
 4  7  9
 5  2  1
 3  6  8

julia> @view a[:, end:-1:1]
3×3 view(::Matrix{Int64}, :, 3:-1:1) with eltype Int64:
 9  7  4
 1  2  5
 8  6  3

请注意,这将创建一个副本,而不是原始数据的视图。 - BallpointBen
现在已经添加了创建视图的示例。 - Markus Kuhn

4

在回答@IainDunning的问题时,numpy和Julia之间的一个重要区别是,Julia中的X [:, end:-1:1]返回一个副本,而在numpy中,X [:, ::-1]将返回相同数据的视图(不会进行复制)。

我自己正在学习Julia,但似乎您可以使用sub(X,:,size(X)[2]:-1:1)在Julia中实现类似的功能,它返回Julia的等效视图(SubArray )。有趣的是,在这种构造中,您不能使用end关键字,只能通过传递维度中的实际结束索引来实现。


4
请注意,Julia v0.4 中的 sub 现在在 Julia v0.5 中被称为 view - Kevin L. Keys

0

尝试使用这组函数:

function reverser(x::AbstractArray, dims::AbstractVector{<:Integer})
    y = copy(x)
    for d in dims
        y = reverse(y, dims=d)
    end
    return y
end

reverser(x::AbstractArray) = reverser(x, 1:ndims(x)) # all dimensions
reverser(x::AbstractArray, d::Integer) = reverser(x, [1])

0

0

Julia 1.6 支持反转任意或所有维度的任意多维数组(在此处实现)。要反转所有维度,您只需执行reverse(X)


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