如何在Dask DataFrame中读取和存储向量(List[float])?

问题描述 投票:0回答:1

我试图在 Dask DataFrame 中拥有来自向量 np.array 的“向量”列。

使用 Pandas DataFrame 代码看起来像这样:

import pandas as pd
import numpy as np

vectors = np.array([
    np.array([1, 2, 3]), 
    np.array([4, 5, 6]), 
    np.array([7, 8, 9])
])

df = pd.DataFrame({
    "vector": vectors.tolist()
})

df

结果 df 是

矢量。
0 [1,2,3]
1 [4,5,6]
2 [7,8,9]

我尝试了几种选择:

选项#1

import dask.dataframe as dd
import dask.array as da
import numpy as np

vectors = np.array([
    np.array([1, 2, 3]), 
    np.array([4, 5, 6]), 
    np.array([7, 8, 9])
])


vectors = da.from_array(vectors)
df = dd.from_dask_array(vectors)

df

这会产生 df,其中向量的每个值都有自己的列

选项#2

import dask.dataframe as dd
import dask.array as da
import numpy as np

# vectors = np.load(dataset_path / "vectors.npy")

vectors = np.array([
    np.array([1, 2, 3]), 
    np.array([4, 5, 6]), 
    np.array([7, 8, 9])
])

df = dd.from_dask_array(da.from_array(vectors))
columns_to_drop = df.columns.tolist()
df["vector"] = df.apply(lambda row: tuple(row), axis=1, meta=(None, 'object'))
df = df.drop(columns=columns_to_drop)

df

这个可以产生正确的结果,但看起来很麻烦而且可能效率不高

python pandas dataframe dask
1个回答
1
投票

可能的解决方法之一是使用

dd.from_dict
:

vectors = np.array([
    np.array([1, 2, 3]),
    np.array([4, 5, 6]),
    np.array([7, 8, 9])
])

df = dd.from_dict({'vector': vectors.tolist()}, vectors.shape[0]).compute()
print(df.head())

      vector
0  [1, 2, 3]
1  [4, 5, 6]
2  [7, 8, 9]
© www.soinside.com 2019 - 2024. All rights reserved.