Спасибо за ваши подсказки, я исправлю это завтра (сейчас у меня есть только мой телефон)
я есть 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
Формат может не помочь, хотя я не уверен в этом.
Если есть другие способы формирования этого продукта, это тоже будет хорошо.
Поскольку я уверен, что есть приложения с наборами данных, размер которых намного больше этого, я надеюсь, что кто-то сталкивался с такими проблемами раньше и хотел бы знать, как решить эту проблему. Пожалуйста помоги.