从展平数组获取2d索引

时间:2019-02-22 20:46:32

标签: julia

给出数组:

arr = [1 2; 3 4; 5 6]

3×2 Array{Int64,2}:
 1  2
 3  4
 5  6

被扁平化的flat_arr = collect(Iterators.flatten(arr))

6-element Array{Int64,1}:
 1                       
 3                       
 5                       
 2                       
 4                       
 6 

有时我需要在两种索引格式之间切换。例如,如果我得到了flat_arr的排序索引,则可能要使用这些排序索引对arr进行迭代。在Python中,通常使用np.unravel_index完成。在Julia中如何完成?我是否只需要编写自己的函数?

2 个答案:

答案 0 :(得分:1)

vec()创建数组的一维视图。因此,您可以在内存中同时拥有两个指向数组的指针,并在任何时候使用所需的任何指针(它们指向同一数组):

julia> arr = [1 2; 3 4; 5 6]
3×2 Array{Int64,2}:
 1  2
 3  4
 5  6

julia> arr1d = vec(arr)
6-element Array{Int64,1}:
 1
 3
 5
 2
 4
 6

julia> arr1d[4] = 99
99

julia> arr
3×2 Array{Int64,2}:
 1  99
 3   4
 5   6

请注意,在Julia中,数组按主列存储,因此第四个值是第二列的第一个值

答案 1 :(得分:1)

这可以使用CartesianIndices完成。

c_i = CartesianIndices(arr)
flat_arr[2] == arr[c_i[2]]) == 3