如何用numpy.loadtxt从无分隔符TXT文件生成二维数组
用Numpy将每行连续数字的文本转换为2D浮点矩阵
问题背景
我有一个内容如下的TXT文件:
30373 25512 65332 33549 35390
希望将其转换为如下的**2D(矩阵)**浮点数组:
[[3. 0. 3. 7. 3.] [2. 5. 5. 1. 2.] [6. 5. 3. 3. 2.] [3. 3. 5. 4. 9.] [3. 5. 3. 9. 0.]]
尝试了以下代码:
import numpy as np print(np.loadtxt('file.txt'))
得到结果:
[30373. 25512. 65332. 33549. 35390.]
不符合预期。又尝试设置delimiter='':
import numpy as np print(np.loadtxt('file.txt', delimiter=''))
结果仍不符合要求。
[编辑]
我知道可以用原生Python实现:
array = [i.split() for i in open('file.txt').read().splitlines()]
但想了解是否可以通过Numpy实现该需求?
Numpy实现方案
方案1:利用loadtxt的converters参数
loadtxt的converters参数可以对每行数据做自定义转换,我们可以把每行的字符串拆分为单个字符,再转为浮点数:
import numpy as np # 自定义转换器:将每行字符串拆分为单个字符并转成浮点数组 arr = np.loadtxt('file.txt', converters={0: lambda line: [float(c) for c in line.strip()]}) print(arr)
运行后会输出符合预期的5×5浮点矩阵。
方案2:读取文本后整体转换并重塑形状
先读取所有文本内容,去除换行符后将每个字符转为数字,最后通过reshape调整为目标矩阵:
import numpy as np # 读取文件所有内容并移除换行符 raw_text = open('file.txt').read().replace('\n', '') # 将每个字符转为浮点,再重塑为5行5列的矩阵 arr = np.array(list(raw_text), dtype=np.float64).reshape(5, 5) print(arr)
这个方法更高效,适合数据量较大的场景。
方案3:结合genfromtxt与字符处理
用genfromtxt读取每行字符串,再通过列表推导拆分每个字符并转换:
import numpy as np # 读取所有行作为字符串数组 str_arr = np.genfromtxt('file.txt', dtype=str) # 拆分每个字符串为单个字符,转成浮点后生成矩阵 arr = np.array([list(line) for line in str_arr], dtype=np.float64) print(arr)
原方法失败原因
- 默认调用
np.loadtxt('file.txt')时,Numpy会将每行的连续数字识别为一个完整数值,因此输出一维数组。 - 设置
delimiter=''无效,因为Numpy的分隔符参数不支持空字符串,它需要明确的分隔符(如逗号、空格)来拆分元素。
内容的提问来源于stack exchange,提问作者Amirhosseinzibaei
相关产品推荐
相关产品推荐

