Одна запись может выглядеть так: индекс (длинный) , данные (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'])
Код: Выделить всё
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
Мобильная версия