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
不过,在这种情况下,我认为解决这个问题最易读的方法是使用 min
或 clamp
:min(someArray, residualLimit)
或 clamp(someArray, -residualLimit, residualLimit)
作为更大算法的一部分,我需要生成数组相对于指定限制的残差。换句话说,我需要生成一个数组,给定 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
不过,在这种情况下,我认为解决这个问题最易读的方法是使用 min
或 clamp
:min(someArray, residualLimit)
或 clamp(someArray, -residualLimit, residualLimit)