如何正确存储与加载单元素numpy数组?解决类型异常问题
解决numpy单元素数组存储后读取无法索引的问题
问题现象
使用np.savetxt存储单元素numpy数组,再用np.loadtxt读取后,得到的是0维数组(标量),无法通过[0]索引访问元素;但多元素数组存储读取后能正常保持一维数组结构,可正常索引。
复现代码:
import numpy as np # 定义列表 listW = ["The Dog","The Cat"] list_single = ["The Pig"] # 转换为numpy数组 arrayW = np.array(listW) array_single = np.array(list_single) # 打印原数组 print('ArrayW:', arrayW) print('Array_single:', array_single) print('ArrayW[0]:', arrayW[0]) print('Array_single[0]:', array_single[0]) # 存储路径 fileW = "C:\\Test\\testW" file_single = "C:\\Test\\test" # 保存数组 np.savetxt(fileW, arrayW, fmt='%s', delimiter=',') np.savetxt(file_single, array_single, fmt='%s', delimiter=',') # 读取数组 testW = np.loadtxt(fileW, dtype=object, delimiter=',') test_single = np.loadtxt(file_single, dtype=object, delimiter=',') # 打印读取结果 print("testW:", testW) print("test_single:", test_single) print("testW[0]:", testW[0]) print("test_single[0]:", test_single[0])
运行输出:
ArrayW: ['The Dog' 'The Cat'] Array_single: ['The Pig'] ArrayW[0]: The Dog Array_single[0]: The Pig testW: ['The Dog' 'The Cat'] test_single: The Pig testW[0]: The Dog
随后报错:
IndexError: too many indices for array: array is 0-dimensional, but 1 were indexed
原因分析
np.savetxt本质是为二维数组设计的文本存储工具,当保存一维数组时,会自动将其视为二维数组的一行。对于单元素一维数组,保存到文件的内容是单行单个字符串;而np.loadtxt读取时,会将这种单行单元素的结构解析为0维数组(标量),而非保持原有的一维数组结构。
解决方案
方案1:加载时指定ndmin参数强制保留维度
在np.loadtxt中添加ndmin=1参数,强制生成至少一维的数组,这样单元素数组读取后会保持一维结构,支持索引:
test_single = np.loadtxt(file_single, dtype=object, delimiter=',', ndmin=1)
修改后运行输出:
test_single: ['The Pig'] test_single[0]: The Pig
方案2:使用np.save/np.load二进制存储
如果不需要文本格式的存储文件,推荐使用numpy原生的二进制存储方式np.save和np.load,它们会完整保留数组的维度、dtype等所有信息,无需额外处理:
# 保存数组 np.save(file_single, array_single) # 读取数组 test_single = np.load(file_single + '.npy')
读取后test_single会和原数组array_single结构完全一致,可直接通过[0]索引元素。
内容的提问来源于stack exchange,提问作者Motougo
相关产品推荐
相关产品推荐

