无法重新分配NumPy数组元素:void转ndarray及代码问题排查
解决numpy.genfromtxt返回void类型数组的问题
当你用numpy.genfromtxt读取CSV并设置dtype=None时,返回的是结构化数组,元素类型为numpy.void。这是因为CSV中包含多种数据类型(比如字符串、整数),numpy会自动生成复合dtype,每个元素对应一条记录的void类型对象。
你的代码问题解析
循环里data_salaries[i] = np.array(record)无法生效,原因是结构化数组的dtype是固定的复合类型,内存结构已经确定。你给元素赋值ndarray时,numpy会自动把这个ndarray转换回原void类型的记录,所以元素类型不会改变。
解决方法
1. 转换为普通二维数组(适合统一类型场景)
如果所有列可以转换成同一类型(比如全转字符串),可以先把结构化数组转成列表,再转成普通ndarray:
import numpy as np data_salaries = np.genfromtxt('D:\\Main\\Data science and Machine Learning\\py dir\\Datasets\\ds_salaries.csv', delimiter=',', encoding=None, dtype=None) # 转换为普通ndarray normal_array = np.array(data_salaries.tolist()) print(type(normal_array[0])) # 输出numpy.ndarray或对应元素类型
2. 保留结构化数组,按需操作
如果需要保留各列的原始数据类型,直接按列访问更高效,不需要转换元素类型:
# 查看自动生成的列名 print(data_salaries.dtype.names) # 按列名提取数据 job_titles = data_salaries['f0'] # 'f0'是自动生成的第一列名,根据实际输出调整 salaries = data_salaries['f1'] # 也可以读取时手动指定列名和类型,更清晰 data_salaries = np.genfromtxt('D:\\Main\\Data science and Machine Learning\\py dir\\Datasets\\ds_salaries.csv', delimiter=',', encoding=None, dtype=[('job_title', 'U50'), ('salary', 'i4'), ('currency', 'U10')]) # 按列名访问 print(data_salaries['job_title'])
3. 读取时直接指定统一dtype
如果CSV中所有元素类型一致,读取时直接设置dtype即可避免生成结构化数组:
# 比如全转字符串 data_salaries = np.genfromtxt('D:\\Main\\Data science and Machine Learning\\py dir\\Datasets\\ds_salaries.csv', delimiter=',', encoding=None, dtype='str')
内容的提问来源于stack exchange,提问作者Moahemd Abdelkhalel
相关产品推荐
相关产品推荐

