Как хранить массивы Numpy или списки списков как записи в одном столбце таблицы PyArrow?Python

Программы на Python
Ответить
Anonymous
 Как хранить массивы Numpy или списки списков как записи в одном столбце таблицы PyArrow?

Сообщение Anonymous »

У меня есть список индексов, и для каждого индекса у меня есть два двумерных массива чисел и несколько скалярных значений.
Одна запись может выглядеть так: индекс (длинный) , данные (np.ndarray), маска (np.ndarray), имя (str).
Я хотел бы сохранить эту информацию в pyarrow.Table, а затем добавить к дельте с помощью deltalake.write_deltalake (требуется таблица delta).
Я не хочу использовать tolist() для массивов numpy, поскольку он не имеет нулевого копирования и требует перераспределения, что не идеально, когда у меня есть массивы ~ 10 тыс. с формой около (150,150). В то же время я бы предпочел иметь в качестве записей двумерные массивы, а не сглаженные массивы, чтобы мне не приходилось беспокоиться о хранении количества строк и столбцов для каждого массива (у меня есть решение для случая 1D).< /p>
Я пытался использовать функцию ниже, чтобы получить pa.ListArray или pa.FixedSizeListArray, но не могу понять, как передать список pyarrow > массивы в конструктор pa.Table.

Код: Выделить всё

# Minimal (not) working example

import numpy as np
import pyarrow as pa

def numpy_2d_array_to_arrow(arr: np.ndarray) -> pa.ListArray:
"""
Zero copy conversion from 2D numpy.ndarray to Apache Arrow List Array
https://issues.apache.org/jira/browse/ARROW-5645
"""
assert (
len(arr.shape) == 2
), 'numpy.ndarray to Arrow conversion error: Expected 2D array.'
# This also works...
# return pa.FixedSizeListArray.from_arrays(arr.ravel(order="C"), arr.shape[1])
offsets = np.arange(0, np.prod(arr.shape) + arr.shape[1], arr.shape[1])
return pa.ListArray.from_arrays(offsets, arr.ravel(order='C'))

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])

pa_arr = numpy_2d_array_to_arrow(arr)
arrays = [pa_arr, pa_arr]  # example (one column, two entries)
indices = [0, 1]

# This fails
table = pa.Table.from_arrays([indices, arrays], ['index', 'data'])
Я пытался вызвать pa.table(...) напрямую, но многомерные массивы numpy в настоящее время не поддерживаются из коробки (

Код: Выделить всё

ArrowInvalid: ('Can only convert 1-dimensional array values', 'Conversion failed for column data with type object')
).
С другой стороны, передача списка списка (

Код: Выделить всё

list[list[value]]
) работает, но для этого мне придется перераспределить массив.

Подробнее здесь: https://stackoverflow.com/questions/791 ... umn-of-a-p
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»