如何解决在茱莉亚
因此,正如标题所述:
是否可以将BitArray{2}
类型的数组转换为Array{Bool,1}:
类型的数组?
PD:问题的核心是我试图用Array{float64,2}
来评估BitArray{2}
,并且不断出现以下错误:
ERROR: BoundsError: attempt to access 20×1 Array{Float64,2} at index [Base.Slice(Base.OneTo(20)),Base.LogicalIndex(Bool[0; 0; … ; 0; 0]),Base.Slice(Base.OneTo(1))]
谢谢!
@梅森 编辑:
因此,我一直在尝试隔离array{Float64,2}
中存在的异常值。我在网上找到了这个two functions,并对其进行了编辑,以允许将Array{float64,2}
数组作为输入。
function idealf(x::Array{Float64,2})
y = sort(x,dims=1);
n = length(x);
j = floor(Int64,n/4+5/12) # 25%ile is in [y[j],y[j+1]]
k = n-j+1 # 75%ile is in [y[k],y[k-1]]
g = n/4+5/12 - j # weighting for the two data surrounding quartiles.
(1-g).*y[j]+g.*y[j+1],(1-g).*y[k]+g.*y[k-1]
end
function outbox(x::Array{Float64,2}; mbox::Bool=false,gval::Real=NaN,method::Bool=true)
n = length(x);
lower_quartile,upper_quartile = idealf(x)
IQR = upper_quartile-lower_quartile
cl = cu = 0.0
if mbox
if isnan(gval)
gval=(17.63*n-23.64)/(7.74*n-3.71)
end
cl = median(x) - gval*IQR
cu = median(x) + gval*IQR
elseif !mbox
if isnan(gval)
gval=1.5
end
cl = lower_quartile - gval*IQR
cu = upper_quartile + gval*IQR
end
flag = (x.<cl) .| (x.>cu)
flag=collect(flag) # tunring my BitArray{2} to a Array{float64,2}
vec = collect(1:n);
outid = vec[flag,:] # TROUBLE HERE
keepid = vec[.!flag] # TROUBLE HERE
outval = x[flag]
nout = length(outid)
if method && !mbox
METHOD = "Outlier detection method using \nthe ideal-fourths based boxplot rule\n"
elseif method && mbox
METHOD = "Outlier detection method using \nthe ideal-fourths based boxplot rule\n(using the modification suggested by Carling (2000))\n"
else
METHOD = nothing
end
return outid,keepid,outval,nout;
end
a=rand(20,1)*10; a[10]=1000.0;a[2]=2000.0;
outbox(a)
我在评估outid = vec[flag,:]
和vec[.!flag]
这行时遇到问题。到目前为止,我找不到超出此功能范围的解决方案。您是否对如何在数组vec
中评估此向量flag
有任何想法?
我正在尝试使用数组运行它:
a=rand(20,1)*10;# 20 random numbers in (0,1]
a[10]=1000.0 # input an outlier on index 10...
解决方法
要回答您的问题,可以使用collect
将BitArray
转换为Array
,并使用vec
将矩阵转换为向量:
julia> BA = BitArray(rand(Bool,3,3))
3×3 BitArray{2}:
0 1 0
1 0 1
1 0 0
julia> collect(BA)
3×3 Array{Bool,2}:
0 1 0
1 0 1
1 0 0
julia> (vec ∘ collect)(BA)
9-element Array{Bool,1}:
0
1
1
1
0
0
0
1
0
不过,从您的“ PD”来看,我怀疑这不能解决您的根本问题,但是您没有提供足够的信息来帮助我。
根据OP的编辑进行编辑:
问题是您试图在逻辑上为大小为Vector
的{{1}}的{{1}}编制索引。与Matlab不同,Julia不会自动将单列矩阵视为向量。这样做有充分的理由,但我知道这可能令人惊讶。
您应该使用BitMatrix
将(20,1)
变成collect
,而不是在BitMatrix
上使用dropdims(flag,dims=2)
,而flag
对于逻辑索引是有效的。 / p>
这是您的原始代码,但带有建议的修复程序:
BitVector
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。