我有一个5维数组,想要对每个字段进行计算,并根据结果用“ true”或“ false”填充每个字段。现在,我想知道是否有一种快速的方法而不使用5个“嵌套”循环。 谢谢您的帮助
编辑: 抱歉,这个问题不清楚。我需要使用5个不同的变量进行计算,并且已经检查了每种可能的组合。 我目前的做法是:
def bisect_left(l, e, start = 0):
if not l:
return start
pos = int(len(l)/2)
if l[pos] < e and (pos+1 >= len(l) or l[pos+1] > e):
return start + pos + 1
elif l[pos] >= e:
return bisect_left(l[:pos], e, start)
else:
return bisect_left(l[pos:], e, start+pos)
其中A是我的数组。现在,我想知道是否有更有效的方法。 抱歉,希望现在可以更清楚地说明。
答案 0 :(得分:1)
您可以使用CartesianIndices
函数,例如:
julia> x = Array{Tuple}(undef, 2,2,2,2,2);
julia> for idx in CartesianIndices(x)
x[idx] = Tuple(idx)
end
julia> x
2×2×2×2×2 Array{Tuple,5}:
[:, :, 1, 1, 1] =
(1, 1, 1, 1, 1) (1, 2, 1, 1, 1)
(2, 1, 1, 1, 1) (2, 2, 1, 1, 1)
[:, :, 2, 1, 1] =
(1, 1, 2, 1, 1) (1, 2, 2, 1, 1)
(2, 1, 2, 1, 1) (2, 2, 2, 1, 1)
[:, :, 1, 2, 1] =
(1, 1, 1, 2, 1) (1, 2, 1, 2, 1)
(2, 1, 1, 2, 1) (2, 2, 1, 2, 1)
[:, :, 2, 2, 1] =
(1, 1, 2, 2, 1) (1, 2, 2, 2, 1)
(2, 1, 2, 2, 1) (2, 2, 2, 2, 1)
[:, :, 1, 1, 2] =
(1, 1, 1, 1, 2) (1, 2, 1, 1, 2)
(2, 1, 1, 1, 2) (2, 2, 1, 1, 2)
[:, :, 2, 1, 2] =
(1, 1, 2, 1, 2) (1, 2, 2, 1, 2)
(2, 1, 2, 1, 2) (2, 2, 2, 1, 2)
[:, :, 1, 2, 2] =
(1, 1, 1, 2, 2) (1, 2, 1, 2, 2)
(2, 1, 1, 2, 2) (2, 2, 1, 2, 2)
[:, :, 2, 2, 2] =
(1, 1, 2, 2, 2) (1, 2, 2, 2, 2)
(2, 1, 2, 2, 2) (2, 2, 2, 2, 2)
The code stores in an entry `x[a,b,c,d,e]` a tuple `(a,b,c,d,e)`.
答案 1 :(得分:0)
您可以执行与一维矩阵相同的操作。
julia> A = rand(4,4,4,4,4);^C
julia> for (i, v) in enumerate(A)
if v > 0.5
A[i] = 0
end
end
此外,类似的东西
julia>map!(x->x>.5, A, A)
如果原始Array是Bool
以外的其他类型,我建议您使用其他矩阵来分配结果值以实现类型稳定性。