将Array转换为指标矩阵

时间:2015-12-24 20:55:09

标签: arrays julia

给定y数组,是否有更清晰或更惯用的方法来创建像Y这样的2D数组?

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

3 个答案:

答案 0 :(得分:4)

另一种方法是使用broadcast

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

.==自动广播,所以如果你只想要一个BitArray,你可以写y .== (1:4)'。)

这避免了显式for循环以及使用hcat来构建数组。但是,根据您要创建的数组的大小,分配适当形状的零数组然后使用索引将这些数据添加到每行的相应列可能是最有效的。 / p>

答案 1 :(得分:2)

数组理解是在Julia中创建矩阵的惯用且快速的方法。对于问题中的示例:

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

答案 2 :(得分:1)

  

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

来自Julia Doc: sparse(I,J,V,[m,n,combine])

  

创建尺寸为m x n的稀疏矩阵S,使得S [I [k],J [k]] =   V [K]。 combine函数用于组合重复项。如果是m和n   如果未指定,则分别设置为max(I)和max(J)。如果   未提供combine功能,默认情况下会添加重复项。

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