Вы можете получить плотный массив из столбца без расширения:
In [179]: df = pd.DataFrame(data=d)
например,
In [180]: np.array(df['a'].str.split().tolist(),float)
Out[180]:
array([[0.05, 0. ],
[0.2 , 0. ]])
Но я сомневаюсь, что это сэкономит много памяти (хотя у меня есть только грубое понимание использования памяти DataFrame
.
Вы можете преобразовать каждую строку в разреженную матрицу:
In [190]: def foo(astr):
...: alist = astr.split()
...: arr = np.array(alist, float)
...: return sparse.coo_matrix(arr)
In [191]: alist = [foo(row) for row in df['a']]
In [192]: alist
Out[192]:
[<1x2 sparse matrix of type '<class 'numpy.float64'>'
with 1 stored elements in COOrdinate format>,
<1x2 sparse matrix of type '<class 'numpy.float64'>'
with 1 stored elements in COOrdinate format>]
In [193]: sparse.vstack(alist)
Out[193]:
<2x2 sparse matrix of type '<class 'numpy.float64'>'
with 2 stored elements in COOrdinate format>
Я пытался сделать coo
прямо из alist
, но при этом не обрезаются нули. Преобразование такое же, но если оно достаточно разреженное (5% или меньше), оно может значительно сэкономить память (если не время).
sparse.vstack
объединяет data,rows,cols
значений из компонентных матриц для определения новой coo
матрицы. Это самый простой способ комбинировать разреженные матрицы, если не самый быстрый.
Похоже, я мог бы использовать и apply
In [205]: df['a'].apply(foo)
Out[205]:
0 (0, 0)\t0.05
1 (0, 0)\t0.2
Name: a, dtype: object
In [206]: df['a'].apply(foo).values
Out[206]:
array([<1x2 sparse matrix of type '<class 'numpy.float64'>'
with 1 stored elements in COOrdinate format>,
<1x2 sparse matrix of type '<class 'numpy.float64'>'
with 1 stored elements in COOrdinate format>], dtype=object)
In [207]: sparse.vstack(df['a'].apply(foo))
Out[207]:
<2x2 sparse matrix of type '<class 'numpy.float64'>'
with 2 stored elements in COOrdinate format>