【问题标题】:Julia Reverse N-dimensional arraysJulia 反转 N 维数组
【发布时间】:2022-03-31 21:05:31
【问题描述】:

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

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

Julia 不支持[::-1]reverse 方法仅适用于一维数组和一维列(其中行默认为二维)。

有没有我想念的替代品?

【问题讨论】:

  • 你试过用 [end:-1:1] 代替 [::-1] 吗?

标签: arrays julia


【解决方案1】:

试试下面的,和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 这也是在 MATLAB 中的惯用方式。
  • 它几乎完全是 numpy 代码所做的,除了 end1 是隐式的,因此无论其他语言经验如何看起来都更自然。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    我自己只是在学习 Julia,但您似乎可以使用 sub(X, :, size(X)[2]:-1:1) 在 Julia 中完成类似的事情,它会返回 Julia 的视图 (SubArray)。有趣的是,据我所知,您不能在此构造中使用 end 关键字,而是必须传入维度中的实际结束索引。

    【讨论】:

    • 请注意,来自 Julia v0.4 的 sub 现在在 Julia v0.5 中是 view
    【解决方案4】:

    您可以使用函数flipdim(mat, d)

    参考:http://docs.julialang.org/en/release-0.4/stdlib/arrays/

    【讨论】:

      【解决方案5】:

      试试这组函数:

      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])
      

      【讨论】:

        【解决方案6】:

        Julia 1.6 支持反转任意多维数组 (implemented here) 的任何或所有维度。要反转所有维度,您只需执行reverse(X)

        【讨论】:

          猜你喜欢
          • 2014-09-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-30
          • 1970-01-01
          • 2018-12-15
          • 1970-01-01
          • 2020-05-15
          相关资源
          最近更新 更多