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

时间:2015-10-10 17:30:07

标签: multidimensional-array julia bitmask bitarray

作为更大算法的一部分,我需要生成相对于指定限制的数组残差。换句话说,我需要生成一个数组,给定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。问题是,为什么朱莉娅不允许使用此BitArray屏蔽someArray

使用BoolsBitArray中的Ints投放到int()并使用.*进行分发会产生所需的结果,但有点不合适......请参阅以下内容:

# 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无法用来屏蔽数组?或者,是否可以简化整个过程?

谢谢,全部!

1 个答案:

答案 0 :(得分:4)

使用逻辑数组进行索引只需选择逻辑数组为true的索引处的元素。您可以将其视为transforming the logical index array with find before doing the indexing expression。请注意,这可以在数组索引和索引分配中使用。这些逻辑数组通常本身称为掩码,但索引更像是一个选择&#34;操作比夹紧操作。

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

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

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