Спасибо за ваши подсказки, я исправлю это завтра (сейчас у меня есть только мой телефон)

я есть 3 массива, и между ними нужно сформировать декартово произведение. Размеры массивов не являются фиксированными, поэтому они могут принимать различные значения, например, A = (10000, 50), B = (40, 50), C = (10000,50).

Затем я выполняю некоторую обработку (например, a + b-c). Ниже приведена функция, которую я использую для продукта.

def cartesian_2d(arrays, out=None):

    arrays = [np.asarray(x) for x in arrays]
    dtype = arrays[0].dtype

    n = np.prod([x.shape[0] for x in arrays])
    if out is None:
        out = np.empty([n, len(arrays), arrays[0].shape[1]], dtype=dtype)

    m = n // arrays[0].shape[0]
    out[:, 0] = np.repeat(arrays[0], m, axis=0)
    if arrays[1:]:
        cartesian_2d(arrays[1:], out=out[0:m, 1:, :])
        for j in range(1, arrays[0].shape[0]):
            out[j * m:(j + 1) * m, 1:] = out[0:m, 1:]
    return out

a = [[ 0, -0.02], [1, -0.15]]
b = [[0, 0.03]]

result = cartesian_2d([a,b,a])

// array([[[ 0.  , -0.02],
    [ 0.  ,  0.03],
    [ 0.  , -0.02]],

   [[ 0.  , -0.02],
    [ 0.  ,  0.03],
    [ 1.  , -0.15]],

   [[ 1.  , -0.15],
    [ 0.  ,  0.03],
    [ 0.  , -0.02]],

   [[ 1.  , -0.15],
    [ 0.  ,  0.03],  
    [ 1.  , -0.15]]])

Вывод такой же, как сitertools.product, Тем не менее, я использую свою пользовательскую функцию, чтобы использовать в своих интересах множественные векторизованные операции, которые работают нормально по сравнению с itertools.product в моем случае.

После этого я делаю

result[:, 0, :] + result[:, 1, :] - result[:, 2, :]

//array([[ 0.  ,  0.03],
       [-1.  ,  0.16],
       [ 1.  , -0.1 ],
       [ 0.  ,  0.03]])

Так что это окончательный ожидаемый результат.

Функция работает, как и ожидалось, пока мой массив помещается в памяти. Но мой сценарий использования требует от меня работы с огромными данными, и я получаю MemoryError в строкеnp.empty() так как он не может выделить, требуется память. Сейчас я работаю с данными объемом около 20 ГБ, и это может увеличиться в будущем.

Эти массивы представляют векторы и должны быть сохранены вfloatпоэтому я не могу использоватьint, Кроме того, они являются плотными массивами, поэтому с помощьюsparse это не вариант.

Я буду использовать эти массивы для дальнейшей обработки, и в идеале я бы не хотел хранить их в файлах на данном этапе. Такmemmap / h5py Формат может не помочь, хотя я не уверен в этом.

Если есть другие способы формирования этого продукта, это тоже будет хорошо.

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

Ответы на вопрос(3)

Ваш ответ на вопрос