Julia的Mathematica Partition
函数的等价物是什么?
Mathematica' s Partition[list,n]
接受一个数组并将其划分为长度为n
的非重叠子列表。另一方面,Julia中的分区函数接受一个数组,并将该数组的所有分区都放入n
个子集。
答案 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];
其中:
和
这可以在以下示例中看到:
我们想将[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]]