在数据集中我有 5000000 行,我想向我的数据集添加一个名为“embeddings”的列。
dataset = dataset.add_column('embeddings', embeddings)
变量 embeddings 是一个大小为 (5000000, 512) 的 numpy memmap 数组。
但我收到此错误:
ArrowInvalidTraceback(最近一次调用最后一次) 在 ----> 1 个数据集 = dataset.add_column('embeddings', embeddings)
/opt/conda/lib/python3.8/site-packages/datasets/arrow_dataset.py 包装器(*args,**kwargs) 第486章 第487章 --> 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 包装器(*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, columns, new_fingerprint) 第3346章 第3347章 ->第3348章column_table = InMemoryTable.from_pydict({name:column}) 第3349章 第3350章 from_pydict(cls, *args, **kwargs) 中的
/opt/conda/lib/python3.8/site-packages/datasets/table.py 第367章 第368章 --> 369 返回 cls(pa.Table.from_pydict(*args, **kwargs)) 370 第371章pyarrow.lib.Table.from_pydict() 中的/opt/conda/lib/python3.8/site-packages/pyarrow/table.pxi
pyarrow.lib._from_pydict() 中的/opt/conda/lib/python3.8/site-packages/pyarrow/table.pxipyarrow.lib.asarray() 中的/opt/conda/lib/python3.8/site-packages/pyarrow/array.pxi
pyarrow.lib.array() 中的/opt/conda/lib/python3.8/site-packages/pyarrow/array.pxi
pyarrow.lib._ndarray_to_array() 中的/opt/conda/lib/python3.8/site-packages/pyarrow/array.pxi
pyarrow.lib.check_status() 中的/opt/conda/lib/python3.8/site-packages/pyarrow/error.pxi
ArrowInvalid:仅处理一维数组
由于嵌入数组不适合 RAM,我该如何解决(可能以有效的方式)?
Dataset
你会得到一个数据集
这就是我解决问题的方法。令人遗憾的是,我们已经 2023 年了,这个问题仍然存在,但幸运的是,这对我有用。
向数据集添加新列Dataset({
features: ['id', 'context', 'question', 'answer0', 'answer1', 'answer2', 'answer3', 'label', 'new_column'],
num_rows: 25262
})
然后,你可以像这样调用该函数:注意:
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
请确保新列(A.K.A)的大小len(新值)
等于现有行数的大小。
这里的问题是您正在尝试添加一列,但您传递的数据是一个 2d numpy 数组。
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])
(用于表示数据集的库)仅支持 1d numpy 数组。
arrow
我认为内存问题没有解决办法。 Huggingface 数据集由箭头表支持,该表必须适合内存。
对于从镶木地板文件加载的数据集,此代码有效
for i, column in enumerate(embeddings.T):
ds = ds.add_column('embeddings_' + str(i), column)