python - 奇怪的行为布尔就地操作
问题描述
我有一个布尔数组,我想做一个简单的单元素二进制膨胀,即设置为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)
这工作得很好。问题是当我想在 to 之后设置元素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]
产生错误的结果?
解决方案
这种切片分配的结果是 undefined/buggy in 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)
推荐阅读
- html - 如何在显示和隐藏时添加带有输入复选框的转换
- android - 使用捕获和模拟对类进行单元测试
- javascript - TypeOrm QueryBuilder 一个表的多个关系
- google-forms - 谷歌表单仍然需要登录
- kivy - 由于不同的 ModuleNotFoundError 原因,Buildozer 不断崩溃
- javascript - React App,努力打造独立的handleToggle
- r - 使用 R 解析目录中的本地 XML 文件
- drools - InvalidPathException - 降级到 8.4.0 或解决方法
- python - 多重继承问题,非合作类?
- c++ - `auto`-array 是 C++20 中的有效函数参数吗?