繁体   English   中英

奇怪的行为布尔就地操作

[英]Odd behaviour boolean in-place operations

我有一个布尔数组,我想做一个简单的单元素二进制扩张,即设置为True所有元素与其他True元素紧邻。

arr=np.array([0,0,1,0,0,0,1,0,0], dtype=bool)
# array([False, False,  True, False, False, False,  True, False, False], dtype=bool)
# set elements before True to also True
arr[:-1] |= arr[1:]; arr
array([False,  True,  True, False, False,  True,  True, False, False], dtype=bool)

这很好用。 问题是当我想要将True之后的元素设置为True

arr[1:] |= arr[:-1]; arr
array([False,  True,  True,  True,  True,  True,  True,  True,  True], dtype=bool)

这个结果是错误的。 有趣的是,如果没有就地完成,最后一个操作就可以了:

arr[1:] = arr[1:] | arr[:-1]; arr
array([False,  True,  True,  True, False,  True,  True,  True, False], dtype=bool)

我无法找出布尔运算符是否像&| 支持就地分配。 如果他们这样做,为什么arr[1:] |= arr[:-1]产生错误的结果?

numpy<1.13.0 ,这样的切片分配的结果是未定义/错误。 请参阅此处的发行说明中的​​提及。

由于数据依赖性问题,ufunc输入和输出操作数具有内存重叠的操作在以前的NumPy版本中产生了未定义的结果。 在NumPy 1.13.0中,此类操作的结果现在定义为与没有内存重叠的等效操作相同。

升级你的numpy版本以获得“正确”的结果。

请注意,二进制扩张直接在scipy中实现:

>>> arr
array([False, False,  True, False, False, False,  True, False, False], dtype=bool)
>>> from scipy.ndimage.morphology import binary_dilation
>>> binary_dilation(arr)
array([False,  True,  True,  True, False,  True,  True,  True, False], dtype=bool)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM