【问题标题】:Boolean (BitArray) multidimensional array indexing or masking in Julia?Julia中的布尔(BitArray)多维数组索引或屏蔽?
【发布时间】:2016-01-08 12:02:37
【问题描述】:

作为更大算法的一部分,我需要生成数组相对于指定限制的残差。换句话说,我需要生成一个数组,给定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.&lt;0)],您会发现它的行为符合预期;它正在生成BitArray。问题是,为什么 Julia 不允许使用这个 BitArray 来掩盖 someArray

使用int()BoolsBitArray 中转换为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 来屏蔽数组吗?或者,有什么方法可以简化整个过程?

谢谢大家!

【问题讨论】:

  • 检查这个语法:(residualLimit-someArray).*(residualLimit-someArray.&lt;0)
  • 怎么样:max(someArray-residualLimit,0)

标签: multidimensional-array julia bitmask bitarray


【解决方案1】:

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

cmets 中的建议不错,不过你也可以使用带索引赋值的逻辑索引来解决你的问题:

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

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

【讨论】:

  • 精彩的答案。谢谢!我最终使用了基于clamp 的解决方案,因为它更容易理解。
猜你喜欢
  • 2018-04-01
  • 2019-06-18
  • 2017-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 2021-09-19
  • 1970-01-01
相关资源
最近更新 更多