numpy 向HuggingFace数据集添加新列

nwwlzxa7  于 2023-06-23  发布在  其他
关注(0)|答案(3)|浏览(117)

在我有5000000行的数据集中,我想添加一个名为“嵌入”的列到我的数据集中。
dataset = dataset.add_column('embeddings', embeddings)
变量 embeddings 是一个大小为(5000000,512)的numpy memmap数组。
但我得到了这个错误:
ArrowInvalidTraceback(most recent call last)in ----> 1 dataset = dataset.add_column('embeddings ',embeddings)
/opt/conda/lib/python3.8/site-packages/datasets/arrow_dataset.py in wrapper(*args,**kwargs)486 } 487 # apply actual function --> 488 out:Union[“Dataset”,“DatasetDict”] = func(self,*args,**kwargs)489个数据集:List[“Dataset”] = list(out.values())if isinstance(out,dict)else [out] 490 #重新应用格式到输出
/opt/conda/lib/python3.8/site-packages/datasets/fingerprint.py in wrapper(*args,**kwargs)404 #调用实际函数405 --> 406 out = func(self,*args,**kwargs)407 408 #更新就地转换的指纹+更新就地转换的历史
/opt/conda/lib/python3.8/site-packages/datasets/arrow_dataset.py in add_column(self,name,column,new_fingerprint)3346:class:Dataset 3347“"”-> 3348 column_table = InMemoryTable.from_pydict({name:column})3349 #水平连接表3350 table = ConcatenationTable.from_tables([self._data,column_table],axis=1)
/opt/conda/lib/python3.8/site-packages/datasets/table.py in from_pydict(cls,*args,**kwargs)367@classmethod 368 def from_pydict(cls,*args,**kwargs):--> 369 return cls(pa.Table.from_pydict(*args,**kwargs))370 371@inject_arrow_table_documentation(pa.Table.from_batches)
/opt/conda/lib/python3.8/site-packages/pyarrow/table.pxi in pyarrow.lib.Table.from_pydict()
/opt/conda/lib/python3.8/site-packages/pyarrow/table.pxi in pyarrow.lib._from_pydict()
/opt/conda/lib/python3.8/site-packages/pyarrow/array.pxi in pyarrow.lib.asarray()
/opt/conda/lib/python3.8/site-packages/pyarrow/array.pxi in pyarrow.lib.array()
/opt/conda/lib/python3.8/site-packages/pyarrow/array.pxi in pyarrow.lib._ndarray_to_array()
/opt/conda/lib/python3.8/site-packages/pyarrow/error.pxi in pyarrow.lib.check_status()
箭头无效:只处理一维数组
既然嵌入数组不适合RAM,我如何解决这个问题?

qco9c6ql

qco9c6ql1#

from datasets import load_dataset

ds = load_dataset("cosmos_qa", split="train")

new_column = ["foo"] * len(ds)
ds = ds.add_column("new_column", new_column)

你得到一个数据集

Dataset({
    features: ['id', 'context', 'question', 'answer0', 'answer1', 'answer2', 'answer3', 'label', 'new_column'],
    num_rows: 25262
})
mm5n2pyu

mm5n2pyu2#

这里的问题是,您试图添加一个列,但您传递的数据是一个2d numpy数组。arrow(用于表示数据集的库)仅支持1d numpy数组。
你可以尝试逐个添加2d numpy数组的每一列:

for i, column in enumerate(embeddings.T):
    ds = ds.add_column('embeddings_' + str(i), column)

既然嵌入数组不适合RAM,我如何解决这个问题?
我不认为有一个围绕内存问题的工作。HuggingFace数据集由箭头表支持,箭头表必须适合内存。

v9tzhpje

v9tzhpje3#

我是这样解决这个问题的。可悲的是,我们已经到了2023年,这个问题仍然存在,但幸运的是,这对我很有效。

向数据集添加新列

def add_new_column(df, col_name, col_values):
    # Define a function to add the new column
    def create_column(updated_df):
        updated_df[col_name] = col_values  # Assign specific values
        return updated_df

    # Apply the function to each item in the dataset
    df = df.map(create_column)

    return df

然后,你可以像这样调用函数:

import datasets as ds

dataset =  ds.Dataset.from_dict({"column_1": ["value1", "value2"],})
new_values = [value3, value4]
updated_dataset = add_new_column(dataset, "column_2", [str(val) for val in new_values])

**注意:**请确保新列的大小(A.K.A)

len(new_values)
等于现有行数的大小。

相关问题