Julia中的分割等价

时间:2014-11-16 03:13:18

标签: arrays wolfram-mathematica julia

Julia的Mathematica Partition函数的等价物是什么?

Mathematica' s Partition[list,n]接受一个数组并将其划分为长度为n的非重叠子列表。另一方面,Julia中的分区函数接受一个数组,并将该数组的所有分区都放入n个子集。

5 个答案:

答案 0 :(得分:11)

所以在Mathematica:

In[1]:= Partition[{a, b, c, d, e, f}, 2]
Out[1]= {{a,b},{c,d},{e,f}}

但在Julia中,partitions函数的含义非常不同:

x = [:a,:b,:c,:d,:e,:f]
first(partitions(x,2))
#2-element Array{Array{Symbol,1},1}:
# [:a,:b,:c,:d,:e]
# [:f]

该集合的所有2个分区的集合。为了得到你想要的东西你可以做点什么

yourpart(x,n) = {{x[i:min(i+n-1,length(x))]} for i in 1:n:length(x)}

julia> yourpart([:a,:b,:c,:d,:e,:f], 2)
3-element Array{Any,1}:
 {:a,:b}
 {:c,:d}
 {:e,:f}

julia> yourpart(x,4)
2-element Array{Any,1}:
 {[:a,:b,:c,:d]}
 {[:e,:f]}

答案 1 :(得分:8)

也许我错过了什么,但这不是你想要的吗?

x = [:a,:b,:c,:d,:e,:f]
n = 2
reshape(x, (n, div(length(x), n)))

答案 2 :(得分:2)

如果其他人也遇到了将数组分成n个部分的相关任务的需要:

function nfolds(x::AbstractArray, n::Int)
    s = length(x) / n
    [x[round(Int64, (i-1)*s)+1:min(length(x),round(Int64, i*s))] for i=1:n]
end

julia> map(length, npartition(1:21, 6))
6-element Array{Int64,1}:
 4
 3
 3
 4
 4
 3 

答案 3 :(得分:2)

这也有效

partitioneddata=[data[n:n+pfac] for n=1:offset:length(data)-pfac];

其中:

  • pfac是" long"你希望你的新阵列都是

  • 偏移量是您希望每个新数组偏移的位置数

这可以在以下示例中看到:

我们想将[1,2,3,4,5,6,7,8,9,10]分割成长度为2的新数组,每个数组移位偏移= 1。

pfac=2
offset=1
partitioneddata=[data[n:n+pfac] for n=1:offset:length(data)-pfac]
8-element Array{Array{Int64,1},1}: 
[1,2,3]
[2,3,4]
[3,4,5]
[4,5,6]
[5,6,7]
[6,7,8]
[7,8,9]
[8,9,10]

我知道我有点迟到了,但希望这会有所帮助!

答案 4 :(得分:2)

这种方法应该(i)更有效地记忆,并且(ii)允许例如将53个数据点分成10个组。

"""
returns ranges (i.e. indices to split the data).
"""
function partition_array_indices(nb_data::Int, nb_data_per_chunk::Int)
    nb_chunks = ceil(Int, nb_data / nb_data_per_chunk)
    ids = UnitRange{Int}[]
    for which_chunk = 1:nb_chunks
        id_start::Int = 1 + nb_data_per_chunk * (which_chunk - 1)
        id_end::Int = id_start - 1 + nb_data_per_chunk
        if id_end > nb_data
            id_end = nb_data
        end
        push!(ids, id_start:id_end)
    end
    return ids
end

使用示例:

x = collect(linspace(0, 1, 53))
nb_data_per_chunk = 10
ids = partition_array_indices(length(x), nb_data_per_chunk)

# get first chunk, 10 elements
x[ids[1]]
# get last chunk, just 3 elements
x[ids[end]]