Numpy布尔索引赋值失效:内容相同的数组赋值结果不一致
问题根本原因
出错的核心是test_arr3属于非内存连续的NumPy数组视图,而你用到的np.empty_like会继承输入数组的步长(stride)属性,最终导致布尔索引赋值逻辑异常。
你可以通过打印数组的flags属性验证差异:
print(test_arr3.flags.c_contiguous) # 输出False,非连续 print(test_arr4.flags.c_contiguous) # 输出True,连续
test_arr3是从4列原数组切片得到的视图,没有触发内存拷贝,内存排布不连续;而test_arr4是直接新建的数组,内存连续。当你调用np.empty_like(arr, dtype=str)时,若输入数组非连续,返回的空字符串数组会继承原int32数组的步长(原int32每个元素占4字节,而U1类型字符串仅占1字节),步长与实际数据宽度不匹配,导致后续布尔索引赋值时写入位置错误,所有值最终被后执行的P覆盖。
验证方式
你可以对test_arr3做一次深拷贝转为连续数组后再调用函数,结果会恢复正常:
easy_labeling(test_arr3.copy())
更稳妥的实现方案
推荐直接用np.where实现逻辑,写法更简洁,且天然规避连续/非连续数组的兼容性问题:
def easy_labeling(arr, thresh=5): return np.where(arr < thresh, 'N', 'P')
内容的提问来源于stack exchange,提问作者phil
相关产品推荐
相关产品推荐

