Я хочу разбить разреженную матрицу ( тип: scipy.sparse.csr.csr_matrix ) на N частей в правильном порядке и итеративно по ним, чтобы использовать их в качестве входных данных для прогнозирования классификации.
Однако, если я пытаюсь преобразовать разреженную матрицу в плотную матрицу с csr_matrix.toarray()
, я получаю MemoryError.Размер преобразованного массива будет занимать 70 ГБ ОЗУ, протестировано с помощью метода в этом потоке ( Ошибка преобразования разреженной матрицы в массив с scipy.sparse.csc_matrix.toarray () )
Поэтому я не могу использовать numpy.array_split()
для разделения массива, потому что он работает только на плотных матрицах.
Есть ли другой способ разбить / нарезать разреженную матрицу на N разреженных матриц?
Спасибо.
Дополнительное редактирование:
Так чтофрагментация происходит следующим образом с разреженным массивом X_test:
# X_test is a sparse matrix with feature vectors
chunk_results = []
X_dense = csr_matrix.toarray(X_test)
X_test_chunks = np.array_split(X_dense, 20)
for chunk in X_test_chunks:
chunk_results.append(classifier.predict(chunk))
prediction = np.concatenate(chunk_results)
Вот пример преобразования небольшой разреженной матрицы в плотную:
# sparse
(0, 0) -0.5
(0, 1) 3.8570557155110414
(0, 2) -1.975755301731886
(1, 0) -3.5
(1, 1) 6.54336961554629
(1, 2) -3.311314222363026
# dense
[[-0.5 3.85705572 -1.9757553 ]
[-3.5 6.54336962 -3.31131422]]
Каждый из этих двух внутренних массивов вплотная матрица - это Feature-Vector, представляющий один объект.По сути, предполагая, что мы попытаемся классифицировать их, выполнив технику разделения на фрагменты с преобразованием в этом примере, мы возьмем n = 2 и получим [-0,5 3,855572 -1,9757553] и [-3,5 6,54336962 -3,31131422] как два блока.В случае, если у нас будет матрица большего размера с большим количеством записей, будет несколько таких векторных массивов на чанк.
РЕШЕНИЕ
Я сделал обходной путьпутем деления числа строк разреженной матрицы на требуемое количество фрагментов и нарезки матрицы на фрагменты строк с этим числом, как предложил hpaulj:
Blockquote np.array_split выполняет нарезанное индексированиеплотный массив, [arr [i: j] для i, j в ....].Таким образом, вы можете сделать то же самое индексирование для матрицы CSR.Разреженная нарезка не так быстра, как плотная версия, но она работает (для правильного разреженного формата).