Julia 中的布尔(BitArray)多维数组索引或屏蔽?

Boolean (BitArray) multidimensional array indexing or masking in Julia?

作为更大算法的一部分,我需要生成数组相对于指定限制的残差。换句话说,我需要生成一个数组,给定 someArray,该数组包含对 someArray 的相应元素超过限制值的数量进行编码的元素。我最初的倾向是使用分布式比较来确定值何时超过阈值。如下:

# Generate some test data.
residualLimit = 1
someArray = 2.1.*(rand(10,10,3).-0.5)

# Determine the residuals.
someArrayResiduals = (residualLimit-someArray)[(residualLimit-someArray.<0)]

问题在于someArrayResiduals是一个包含残差值的一维向量,而不是(residualLimit-someArray)的掩码。如果您检查 [(residualLimit-someArray.<0)],您会发现它的行为符合预期;它正在生成 BitArray。问题是,为什么 Julia 不允许使用这个 BitArray 来掩盖 someArray?

使用 int()BitArray 中的 Bools 转换为 Ints 并使用 .* 分发产生了预期的结果,但有点不雅。 .. 见下文:

# Generate some test data.
residualLimit = 1
someArray = 2.1.*(rand(10,10,3).-0.5)

# Determine the residuals.
someArrayResiduals = (residualLimit-someArray).*int(residualLimit-someArray.<0)

# This array should be (and is) limited at residualLimit. This is correct...
someArrayLimited = someArray + someArrayResiduals

有人知道为什么 BitArray 不能用来屏蔽数组吗?或者,有什么方法可以简化整个过程?

谢谢大家!

使用逻辑数组进行索引只是选择逻辑数组为真的索引处的元素。您可以将其视为 transforming the logical index array with find before doing the indexing expression。请注意,这可以用于数组索引和索引赋值。这些逻辑数组本身通常称为掩码,但索引更像是一个 "selection" 操作而不是钳位操作。

评论中的建议很好,但您也可以使用带索引赋值的逻辑索引来解决您的问题:

overLimitMask = someArray .> residualLimit
someArray[overLimitMask] = residualLimit

不过,在这种情况下,我认为解决这个问题最易读的方法是使用 minclampmin(someArray, residualLimit)clamp(someArray, -residualLimit, residualLimit)