用Numpy读取CSV向量文件输出含零元素的索引(+1)时报AttributeError怎么解决
代码问题定位与修复
核心错误原因
- 错误1:文件行内容未做格式转换
循环读取csv时,每次拿到的line是包含整行内容的字符串(例如第一行读值为"0,0,1,0,1\n")。直接将字符串传入np.array()生成的是仅包含单个字符串元素的0维数组,并非拆分完成的数值型向量。此时执行x==0本质是拿字符串和整数0做比较,返回的是单个布尔值(如False),而非元素为布尔值的数组,后续调用np.flatnonzero时就会触发AttributeError: 'bool' object has no attribute 'ravel'的报错。
你之前直接在代码里定义数值列表的写法能正常运行,正是因为跳过了“从文件读字符串、拆分转换为数值数组”的环节,生成的x是符合预期的一维数值数组。 - 错误2:文件写入参数类型不匹配
file.write()方法仅接受字符串类型的输入,即使前面生成了正确的索引数组,直接将numpy数组传入写入方法也会触发类型错误,无法生成预期的逗号分隔输出格式。
修正后的可运行代码
import numpy as np with open("c:\\input.csv","r") as csv_file, open("c:\\result.csv","w") as output: for line in csv_file: # 去除首尾换行/空白,按逗号拆分片段并转为整数,生成数值型数组 elements = list(map(int, line.strip().split(","))) x = np.array(elements) # 计算所有0值位置的1基索引(从1开始计数) zero_index = np.flatnonzero(x == 0) + 1 # 将索引列表转为逗号分隔的字符串,追加换行符后写入输出文件 output.write(",".join(map(str, zero_index)) + "\n")
运行效果
上述代码执行后,生成的result.csv内容与预期完全一致:
1,2,4 4,5 1,3,5 2,4 1,2,5
内容的提问来源于stack exchange,提问作者J. Silva
相关产品推荐
相关产品推荐

