Я создаю большую разреженную матрицу CSR, которая использует довольно много памяти даже в разреженном формате, поэтому я хочу избежать копирования при создании матрицы. Наиболее эффективный способ, который я нашел, - это создание сжатого представления разреженных строк напрямую. Однако инициализатор класса копирует массивы, которые я передаю ему, поэтому я установил непосредственно элементы данных. Пример:
from scipy import sparse
m = sparse.csr_matrix((5,5))
m.data = np.arange(5)
m.indices = np.arange(5)
m.indptr = np.arange(6)
Кажется, это работает, но я не нашел его в документации, я хотел бы знать, поддерживается ли он, если он ломает что-то, что я не пробовал.
Также было бы полезно узнать, могу ли я использовать массивы memmapped без причуд или использовать различные целочисленные типы данных для индексов.
Редактировать:
Принятые ответ показывает, что при правильных типах индексов копирование не происходит. Я проверил __init__
и, даже когда он не копирует indices
и indptr
, он дважды сканирует оба из них, чтобы найти минимальное и максимальное значения, и фактически ничего не делает, кроме установки data
, indices
и indptr
членов, если входы правильно сформированы, поэтому для производительности я сейчас делаю:
# [...] get shape and data from somewhere
m = sparse.csr_matrix(shape, dtype=data.dtype)
indices = np.empty(..., dtype=m.indices.dtype)
indptr = np.empty(..., dtype=m.indptr.dtype)
# [...] fill indices and indptr
m.data = data
m.indices = indices
m.indptr = indptr
# Possibly also do one or both of the following:
m.has_sorted_indices = True
m.has_canonical_format = True