Python提取numpy数组各元素前两位字符及报错解决咨询
问题根因
你代码里存在3处核心错误直接导致报错和逻辑异常:
- 下标顺序写反:
y[i[:2]]的逻辑是先对整数变量i做切片,整数本身不支持下标操作,自然触发报错。正确写法是先取numpy数组的第i个元素,再对该字符串取前两位,即y[i][:2] - 遍历长度取值错误:
x=len(data[0])取的是从文件读取的第一行原始字符串的总长度,不是数组内的元素个数,应该取numpy数组y的长度作为遍历上限。 - 分支缩进错误:
elif、else的缩进层级和if不匹配,会触发语法错误。
修复后的循环实现
import numpy as np with open('trial.dat', 'r') as f: data = f.readlines() data = [(d+' ')[:d.find('#')].rstrip() for d in data] x_1 = eval(data[0]) y = np.concatenate(x_1) # 直接遍历数组每个元素 for elem in y: prefix = elem[:2] if prefix == 'IS': print('ok-CHOICE ONE ') elif prefix == 'AT': print('NOTok ') else: print()
纯numpy向量化实现(符合numpy原生需求,无需写循环)
numpy自带字符串向量化操作接口,处理大数组时效率远高于手动循环:
import numpy as np with open('trial.dat', 'r') as f: data = f.readlines() data = [(d+' ')[:d.find('#')].rstrip() for d in data] x_1 = eval(data[0]) y = np.concatenate(x_1) # 批量判断所有元素的前缀 is_is = np.char.startswith(y, 'IS') is_at = np.char.startswith(y, 'AT') # 批量生成对应结果并输出 for res in np.where(is_is, 'ok-CHOICE ONE ', np.where(is_at, 'NOTok ', '')): print(res)
两种方案针对你提供的测试数据,输出结果完全一致:
ok-CHOICE ONE NOTok ok-CHOICE ONE
补充提示:使用
eval读取外部文件内容存在代码注入风险,如果数据来源不受控,建议导入ast模块后用ast.literal_eval(data[0])代替eval(data[0]),安全性更高。
内容的提问来源于stack exchange,提问作者msci
相关产品推荐
相关产品推荐

