2015-12-24 232 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