У меня есть генератор, который генерирует единый размер numpy.array
s такой же длины. Я хотел бы иметь разреженную матрицу, содержащую эти данные. Строки генерируются в том же порядке, который я хотел бы иметь в финальной матрице. csr
матрица предпочтительнее над матрицей lil
, но я предполагаю, что последнее будет легче построить в описываемом мной сценарии.Создание scipy.lil_matrix с использованием генератора питона эффективно
Предполагает, что row_gen
является генератором с заданными numpy.array
строками, следующий код работает должным образом.
def row_gen():
yield numpy.array([1, 2, 3])
yield numpy.array([1, 0, 1])
yield numpy.array([1, 0, 0])
matrix = scipy.sparse.lil_matrix(list(row_gen()))
Поскольку список будет существенно испортить какие-либо преимущества генератора, я хотел следующее иметь один и тот же конечный результат. Более конкретно, я не могу провести всю плотную матрицу (или список всех строк матрицы) в памяти:
def row_gen():
yield numpy.array([1, 2, 3])
yield numpy.array([1, 0, 1])
yield numpy.array([1, 0, 0])
matrix = scipy.sparse.lil_matrix(row_gen())
Однако это вызывает следующее исключение при запуске:
TypeError: no supported conversion for types: (dtype('O'),)
Я также заметил след включает в себя следующее:
File "/usr/local/lib/python2.7/site-packages/scipy/sparse/lil.py", line 122, in __init__
A = csr_matrix(A, dtype=dtype).tolil()
что заставляет меня думать, используя scipy.sparse.lil_matrix
в конечном итоге создание csr
матрицы и только затем преобразовать, что к lil
матрица. В этом случае я предпочел бы просто создать матрицу csr
.
Напомним, что мой вопрос: какой самый эффективный способ создать матрицу scipy.sparse
из генератора питона или одномерных массивов numpy?
Спасибо, но оба из предложенных вами подходов предполагают, что у меня есть форма матрицы. Это не так, и поскольку lil специально построен для линейных дополнений, я ищу способ эффективно увеличить его размер по мере его создания. – NirIzr
Что неизвестно - количество строк или количество столбцов? или оба? Сбор трио массивов 'coo' не требует знания конечного размера, но' редкие' матрицы не предназначены для постепенного роста (а также редких массивов). – hpaulj