如何合并Orange数据表导出的二维NumPy数组内三列文本?
解决单数组内多列文本合并问题
错误原因
你遇到的TypeError是因为np.hstack()只接受一个参数(数组的序列),但你直接传入了三个单独的数组切片。而且hstack的作用是将多个数组在水平方向堆叠(比如把三列拼成一个更长的一维数组),这和你要合并每行的三个文本字符串的需求不匹配。
正确解决方案
根据你使用Orange的场景,分两种情况处理:
情况1:in_data是结构化NumPy数组
如果in_data是支持列名索引的结构化NumPy数组,直接遍历每行拼接字符串:
import numpy as np # 合并每行的三个文本列,可自定义分隔符(比如空格、换行) merged_text = np.array( [f"{cb} {hit} {ca}" for cb, hit, ca in zip(in_data['ContextBefore'], in_data['Hit'], in_data['ContextAfter'])], dtype=str ) # 可选:将合并后的列添加到原数组中 out_data = np.lib.recfunctions.append_fields( in_data, 'MergedText', merged_text, usemask=False ) # 查看前10行结果 print(out_data['MergedText'][:10])
情况2:in_data是Orange Table对象
在Orange的Python脚本模块中,输入数据通常是Orange.data.Table类型,更适合直接操作行数据:
from Orange.data import StringVariable # 创建新的字符串列用于存储合并结果 merged_col = StringVariable("MergedText") out_data = in_data.add_column(merged_col) # 遍历每行合并文本 for row in out_data: # 自定义分隔符,比如用空格连接,或根据需求调整 row["MergedText"] = f"{row['ContextBefore']} {row['Hit']} {row['ContextAfter']}" # 查看前10行结果 print([row["MergedText"] for row in out_data[:10]])
补充说明
如果你确实需要用hstack堆叠数组(比如把三列元素拼成一维数组),正确写法是将数组放进列表:
# 仅堆叠数组,不合并文本 stacked_array = np.hstack([in_data[:, 'ContextBefore'], in_data[:, 'Hit'], in_data[:, 'ContextAfter']])
但这不符合你合并每行文本的需求,所以优先用前面的字符串拼接方法。
内容的提问来源于stack exchange,提问作者user3992979
相关产品推荐
相关产品推荐

