基于多条件将3D NumPy整数数组转换为0-1数组的技术实现求助
解决大尺寸NumPy数组的条件赋值问题
嘿,我看到你在处理1400万规模的3D NumPy数组时遇到了不少头疼的问题,咱们先把你踩过的坑捋清楚,再给你一套能轻松复用的解决方案!
你之前出错的核心原因
所有报错的根源其实都是同一个小疏忽:你调用copy的时候没加括号!atlasarray.copy是指向这个方法本身的引用,而不是执行复制操作得到的新数组。后续你拿这个方法对象和整数做比较,自然会出现“'<‘ not supported between instances of 'builtin_function_or_method' and 'int'”这类错误——毕竟方法和整数本来就没法比嘛。
只要把atlasarray.copy改成atlasarray.copy(),你的很多尝试其实都能正常跑起来!
针对不同场景的解决方案
下面针对你提到的单一条件、多条件(最多5个值匹配)的场景,给出高效且易复用的代码:
1. 单一条件场景(比如只匹配87)
有两种简洁的方式,都适合大数组:
# 方法1:用np.where一行转换 heartPETarray = atlasarray.copy() heartPETarray = np.where(heartPETarray == 87, 1, 0) # 方法2:布尔索引(大数组下效率更高) heartPETarray = atlasarray.copy() heartPETarray[:] = 0 # 先全部置0 heartPETarray[heartPETarray == 87] = 1 # 匹配条件的设为1
2. 多条件场景(比如匹配87、88,或最多5个值)
推荐用np.isin,这个方法专门用来检查元素是否在指定集合中,代码简洁且复用性极强——不管是2个还是5个目标值,只要修改目标集合就行:
# 定义目标值集合(用集合比列表查找更快,适合大数组) target_values = {87, 88} # 如果你需要匹配5个值,改成 {10,20,30,40,50} 就行 # 方法1:布尔索引(高效直观) heartPETarray = atlasarray.copy() heartPETarray[:] = 0 # 把原数组中属于target_values的位置设为1 heartPETarray[np.isin(atlasarray, target_values)] = 1 # 方法2:np.where一行搞定 heartPETarray = np.where(np.isin(atlasarray, target_values), 1, 0)
修正你之前的尝试示例
比如你第一次尝试的代码,修正后就能正常工作:
heartPETarray = atlasarray.copy() # 加括号! # 把非87、88的元素置0 heartPETarray[(heartPETarray < 87) | (heartPETarray > 88)] = 0 # 再把剩下的87、88转换成1 heartPETarray[(heartPETarray == 87) | (heartPETarray == 88)] = 1
大数组的效率小提示
因为你的数组规模达到1400万,尽量避免用多个|连接多个==条件(比如(a==87)|(a==88)),这种方式不仅代码冗长,当条件变多(比如5个)时还容易出错。np.isin在底层做了优化,处理大数组的速度会更快,代码也更整洁。
内容的提问来源于stack exchange,提问作者m4rkb4
相关产品推荐
相关产品推荐

