如何从文本文件提取数字数组并转换为Numpy数组?
我有一个文本文件,内容如下:
text a bla bla 1 2 3 4 5 6 text b bla 7 8 9 10 11 12 text c bla bla bla 13 14 15 16 17 18
我希望仅提取其中的数字数组并转换为目标NumPy数组:array([[ 1, 2, 3, 4, 5, 6], [ 7, 8, 9, 10, 11, 12], [ 13, 14, 15, 16, 17, 18]])
我尝试使用np.genfromtxt('test.txt',usecols=[0,1,2],invalid_raise=False),得到结果为array([[ 1., 2., 3.], [ 4., 5., 6.], [ 7., 8., 9.], [ 10., 11., 12.], [ nan, nan, nan], [ 13., 14., 15.], [ 16., 17., 18.]]),该结果不符合预期,请问如何解决?
你的问题核心在于np.genfromtxt并不适合处理这种数字被非文本分散成多组的场景——它默认按空白分割所有元素,遇到非数字会生成NaN,而且没法识别你想要的"每6个数字一组"的逻辑。咱们换个更直接的思路:先把所有数字捞出来,再重新塑形。
步骤1:提取所有数字
先读取整个文件的内容,用正则表达式匹配出所有数字,转成整数列表:
import numpy as np import re # 读取文件内容 with open('test.txt', 'r') as f: content = f.read() # 匹配所有数字字符串,转成整数 all_numbers = list(map(int, re.findall(r'\d+', content)))
步骤2:重塑为目标数组
现在all_numbers是一个包含18个元素的一维列表,直接用reshape把它转换成3行6列的数组即可:
target_array = np.array(all_numbers).reshape(3, 6) print(target_array)
运行后你会得到完全符合预期的输出:
array([[ 1, 2, 3, 4, 5, 6], [ 7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18]])
补充:如果分组规则更灵活怎么办?
如果未来你的分组不是固定的3行6列,而是每个text x后面跟着一组6个数字,那可以稍微调整逻辑,按text分割文本后再提取每组的数字:
with open('test.txt', 'r') as f: content = f.read() # 按text分割,跳过第一个空元素 groups = content.split('text')[1:] num_groups = [] for group in groups: # 提取每组的数字 nums = list(map(int, re.findall(r'\d+', group))) num_groups.append(nums) target_array = np.array(num_groups)
这样哪怕文本里的text分组数量变化,代码也能自动适配。
内容的提问来源于stack exchange,提问作者HappyPy

