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

如何按分隔符将原始数据拆分并读取为不同NumPy数组

按分隔行拆分文本数据为多个NumPy数组

你的原始数据格式如下:

#######
#######
#col1 #col2 #col3
1       10    100
2       11    150
3       14    155
#######
#######
#######
#######
#col1 #col2 #col3
1       14    100
2       17    180
3       14    155
#######
#######
#######
#######
#col1 #col2 #col3
1       19    156
2       27    130
3       24    152
#######
#######

直接用numpy.loadtxt会把所有数据揉成单个数组,要按#######行拆分成独立数组,可以试试下面两种方法:


方法一:纯标准库+NumPy实现

先把文件内容按行读出来,手动按分隔符拆分出有效数据块,再对每个块单独用loadtxt加载。代码示例:

import numpy as np
from io import StringIO

# 读取文件所有行(如果数据是字符串形式,直接split('\n')就行)
with open('your_data_file.txt', 'r') as f:
    all_lines = f.readlines()

# 按分隔行拆分数据块
separator = '#######\n'
data_blocks = []
current_block = []

for line in all_lines:
    if line == separator:
        # 遇到分隔符时,把当前积累的非空块存起来
        if current_block:
            data_blocks.append(current_block)
            current_block = []
    else:
        current_block.append(line)
# 处理最后一个未被分隔符结尾的块
if current_block:
    data_blocks.append(current_block)

# 把每个有效块转成NumPy数组
result_arrays = []
for block in data_blocks:
    # 过滤掉空行和注释行(#开头的行)
    valid_lines = [line for line in block if line.strip() and not line.strip().startswith('#')]
    if valid_lines:
        # 用StringIO把字符串模拟成文件对象,传给loadtxt
        array = np.loadtxt(StringIO(''.join(valid_lines)))
        result_arrays.append(array)

# 验证结果
for idx, arr in enumerate(result_arrays):
    print(f"第{idx+1}个数据块:")
    print(arr)
    print('---')

方法二:用Pandas辅助拆分(适合已有Pandas依赖的场景)

如果你的项目已经在用Pandas,可以用它快速标记数据块再拆分,代码更简洁:

import pandas as pd
import numpy as np

# 先读取所有行用于标记块
with open('your_data_file.txt', 'r') as f:
    all_lines = f.readlines()

# 给每一行数据分配块ID
block_ids = []
current_block = -1
for line in all_lines:
    stripped_line = line.strip()
    if stripped_line == '#######':
        current_block += 1
    # 只给有效数据行分配ID(跳过注释、分隔符和空行)
    elif stripped_line and not stripped_line.startswith('#'):
        block_ids.append(current_block)

# 读取数据,跳过分隔符和注释行
df = pd.read_csv(
    'your_data_file.txt',
    sep='\s+',
    comment='#',
    header=None,
    skiprows=lambda x: all_lines[x].strip() == '#######'
)

# 按块ID拆分DataFrame,转成NumPy数组
result_arrays = [
    df.iloc[[i for i, bid in enumerate(block_ids) if bid == k]].to_numpy()
    for k in set(block_ids)
]

内容的提问来源于stack exchange,提问作者brownser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:20:38