我有一个布尔数组,我想做一个简单的单元素二进制膨胀,即将所有与其他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]
产生错误的结果?
答案 0 :(得分:4)
这样的切片分配的结果在numpy<1.13.0
中是不确定的/混乱的。请参阅发行说明here中的提及。
由于数据依赖性问题,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)