2015-12-24 317 views
2

给定y阵列,是否有更清晰或更习惯的方式来创建2D阵列,如Y?将阵列转换为指标矩阵

y = [1.0 2.0 3.0 4.0 1.0 2.0]' 

Y = ifelse(y .== 1, 1.0, 0.0) 
for j in 2:length(unique(y)) 
    Y = hcat(Y, ifelse(y .== j, 1.0, 0.0)) 
end 

julia> Y 
6x4 Array{Float64,2}: 
1.0 0.0 0.0 0.0 
0.0 1.0 0.0 0.0 
0.0 0.0 1.0 0.0 
0.0 0.0 0.0 1.0 
1.0 0.0 0.0 0.0 
0.0 1.0 0.0 0.0 
+1

只是关于术语的说明:'y'不是一维数组;它是2D,6x1数组,如'ndims(y)'所示。见http://docs.julialang.org/en/latest/manual/noteworthy-differences/ – amrods

回答

4

一种替代方法是使用broadcast:(.==广播自动的,所以如果你只是想要一个BitArray你可以写y .== (1:4)'

julia> broadcast(.==, y, (1:4)') 
6x4 Array{Float64,2}: 
1.0 0.0 0.0 0.0 
0.0 1.0 0.0 0.0 
0.0 0.0 1.0 0.0 
0.0 0.0 0.0 1.0 
1.0 0.0 0.0 0.0 
0.0 1.0 0.0 0.0 

这就避免了明确for环并且还使用hcat来构建阵列。但是,根据您希望创建的数组的大小,分配适当形状的零数组可能是最有效的,然后使用索引将其添加到每行的相应列中。

2

数组理解是一种在朱莉娅中创建矩阵的惯用且快速的方法。对于这个问题的例子:

y = convert(Vector{Int64},vec(y)) # make sure indices are integer 
Y = [j==y[i] ? 1.0 : 0.0 for i=1:length(y),j=1:length(unique(y))] 

什么,可能是为了为:

Y = [j==y[i] ? 1.0 : 0.0 for i=1:length(y),j=1:maximum(y)] 

在这两种情况下,Y为:

6x4 Array{Float64,2}: 
1.0 0.0 0.0 0.0 
0.0 1.0 0.0 0.0 
0.0 0.0 1.0 0.0 
0.0 0.0 0.0 1.0 
1.0 0.0 0.0 0.0 
0.0 1.0 0.0 0.0 
1

在数值分析,一个稀疏矩阵是其中大部分元素为零的矩阵。

而且从朱莉娅文档: sparse(I,J,V,[m,n,combine])

创建的m×n维,使得S [I [k]的,J [K] = V [k]的一个稀疏矩阵S。组合函数用于组合重复项。如果未指定m和n ,则分别将其设置为max(I)和max(J)。如果 未提供组合功能,则默认添加重复项。

y = [1, 2, 3, 4, 1, 2] 
rows=length(y); 
clms=4 # must be >= maximum(y); 
s=sparse(1:rows,y,ones(rows),rows,clms); 
full(s) # => 
6x4 Array{Float64,2}: 
1.0 0.0 0.0 0.0 
0.0 1.0 0.0 0.0 
0.0 0.0 1.0 0.0 
0.0 0.0 0.0 1.0 
1.0 0.0 0.0 0.0 
0.0 1.0 0.0 0.0