【发布时间】:2019-10-30 10:13:36
【问题描述】:
我有一个 dask 数据框,它在一列中包含图像路径(称为 img_paths)。在接下来的步骤中我想做的是使用这些图像路径将图像加载到另一列(称为img_loaded),然后应用一些预处理功能。
但是,在加载(或图像读取)过程中,我总是得到不同的结果,包括一次延迟包装 imread 函数,另一次正确加载图像(我可以看到数组)和其余时间: FileNotFoundError.
除了以下示例之外,我还使用了map_partitions 函数,但除了没有数组之外,我也得到了类似的输出。最后,我想使用map_partitions 函数而不是apply 函数。
以下是我的代码和问题描述:
import pandas as pd
import dask
import dask.dataframe as dd
from skimage.io import imread
imgs = ['https://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-logo.png?v=9c558ec15d8a'] * 42
# create a pandas dataframe using image paths
df = pd.DataFrame({"img_paths": imgs})
# convert it into dask dataframe
ddf = dd.from_pandas(df, npartitions=2)
# convert imread function as delayed
delayed_imread = dask.delayed(imread, pure=True)
第一次尝试:使用 lambda 函数并将延迟的imread 应用于每个单元格
ddf["img_loaded"] = ddf.images.apply(lambda x: delayed_imread(x))
ddf.compute()
这里我得到的是使用compute() 方法时延迟的imread 函数的包装。我不理解为什么?以下是输出:
第二次尝试:不使用 lambda 函数
ddf["img_loaded"] = ddf.images.apply(delayed_imread)
ddf.compute()
这已经奏效了!至少,我可以将加载的图像视为数组。但是,我真的不明白为什么?为什么这与第一个解决方案不同(即使用 lambda 函数)以下是输出:
第三次尝试:使用/不使用 lambda 函数以及不使用延迟 imread。
ddf["load"] = ddf.images.apply(imread) # or, lambda x: imread(x)
ddf.compute()
在这里,再次只是为了进行实验,我没有使用延迟的imread 函数,而是简单地使用了skimage.io.imread 函数。而且,我尝试过使用和不使用 lambda 函数。每次,我都会收到 FileNotFoundError。我没有得到这个。为什么在使用非延迟读取功能时找不到图像路径(虽然它们是正确的)?
除了罗纳德的回答,如何使用map_partitions函数:
ddf["img_loaded"] = ddf.map_partitions(lambda df: df.images.apply(lambda x: imread(x)), meta=("images", np.uint8)).compute()
ddf.compute()
【问题讨论】:
标签: python pandas dask dask-delayed