You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法重新分配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 23:06:08