Нужна помощь в преобразовании фрейма данных cuDF в cupy ndarray - PullRequest
0 голосов
/ 07 мая 2020

Я хочу преобразовать фрейм данных cuDF в cupy ndarray. Я использую следующий код:

import time
import numpy as np
import cupy as cp
import cudf
from numba import cuda
df = cudf.read_csv('titanic.csv')
arr_cupy = cp.fromDlpack(df.to_dlpack())

Вывод:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-176-0d6ff9785189> in <module>
----> 1 arr_cupy = cp.fromDlpack(df.to_dlpack())

~/.conda/envs/rapids_013/lib/python3.7/site-packages/cudf/core/dataframe.py in to_dlpack(self)
   3821         import cudf.io.dlpack as dlpack
   3822 
-> 3823         return dlpack.to_dlpack(self)
   3824 
   3825     @ioutils.doc_to_csv()

~/.conda/envs/rapids_013/lib/python3.7/site-packages/cudf/io/dlpack.py in to_dlpack(cudf_obj)
     72         )
     73 
---> 74     return libdlpack.to_dlpack(gdf_cols)

cudf/_libxx/dlpack.pyx in cudf._libxx.dlpack.to_dlpack()

ValueError: Cannot create a DLPack tensor with null values.                     Input is required to have null count as zero.

Я получаю эту ошибку, потому что набор данных имеет нулевые значения. Как я могу это сделать ??

1 Ответ

3 голосов
/ 07 мая 2020

Давайте рассмотрим ваши две проблемы:)

От cudf df до cupy ndarray: Вы можете использовать to_gpu_matrix и преобразовать его в массив cupy, как показано ниже. Это сохраняет все на GPU, поскольку это довольно эффективно.

arr_cupy = cp.array(df.to_gpu_matrix())

https://docs.rapids.ai/api/cudf/stable/api.html#cudf .core.dataframe.DataFrame.to_gpu_matrix

В будущем (или даже присутствует, о котором я еще не знаю), может быть более прямой способ. Если по какой-то причине вам нужен DLPack, ладно, ваш способ работает. Это подводит нас ко второй проблеме ...

Нулевые значения : чтобы заполнить нулевые значения, вы должны использовать .fillna(). Используйте значение, которое, по вашему мнению, неуместно. https://docs.rapids.ai/api/cudf/stable/api.html#cudf .core.dataframe.DataFrame.fillna

Вместе они могут выглядеть так:

arr_cupy = cp.array(df.fillna(-1).to_gpu_matrix())

Тип вывода: cupy.core.core.ndarray

Выходной массив из моего тестового df:

array([[          0,    17444256,        1200],
       [          1,   616285571,         987],
       [          2,          -1,         407],
       ...,

где -1 - искусственно созданный нуль

Надеюсь, что это поможет!

...