如何在Python中按条件将二维NumPy数组元素替换为字符串?
Numpy二维数组元素替换方案
问题描述
需要将Numpy二维数组中大于100的元素替换为字符串"True",小于等于100的替换为字符串"False",原代码执行失败,以下是原代码及期望输出:
原代码
import numpy as np h1 =np.array([[10, 85, 103, 444, 150, 200, 35, 47], [532, 476, 0, 1011, 50, 674, 5, 999], [985, 7, 99, 101, 1, 58, 300, 78], [750, 649, 86, 8, 505, 41, 745, 187]]) for r in range (0,len(h1)): for c in range(0,len(h1[0])): valor = h1[r][c] if valor > 100: h1[r][c] = 'True' else: h1[r][c] = 'False'
期望输出
[['False', 'False', 'True', 'True', 'True', 'True', 'False', 'False'], ['True', 'True', 'False', 'True', 'False', 'True', 'False', 'True'], ['True', 'False', 'False', 'True', 'False', 'False', 'True', 'False'], ['True', 'True', 'False', 'False', 'True', 'False', 'True', 'True']]
错误原因
原Numpy数组默认是数值类型(如int64),Numpy数组要求元素类型统一,直接给数值类型数组赋值字符串会触发类型不兼容错误,导致代码执行失败。
解决方案
方案一:转换为Object类型数组后循环赋值
先将数组转换为支持混合类型的object类型,再执行循环替换:
import numpy as np h1 = np.array([[10, 85, 103, 444, 150, 200, 35, 47], [532, 476, 0, 1011, 50, 674, 5, 999], [985, 7, 99, 101, 1, 58, 300, 78], [750, 649, 86, 8, 505, 41, 745, 187]]) # 转换为object类型,允许存储字符串 h1 = h1.astype(object) for r in range(len(h1)): for c in range(len(h1[0])): h1[r][c] = 'True' if h1[r][c] > 100 else 'False' print(h1)
方案二:使用Numpy向量化操作(高效推荐)
利用np.where直接生成目标字符串数组,无需循环,更符合Numpy的使用习惯:
import numpy as np h1 = np.array([[10, 85, 103, 444, 150, 200, 35, 47], [532, 476, 0, 1011, 50, 674, 5, 999], [985, 7, 99, 101, 1, 58, 300, 78], [750, 649, 86, 8, 505, 41, 745, 187]]) # 向量化替换:满足条件的位置赋值'True',否则'False' result = np.where(h1 > 100, 'True', 'False') print(result)
两种方案输出结果均与期望一致。
内容的提问来源于stack exchange,提问作者victhor99
相关产品推荐
相关产品推荐

