[英]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.