Я не согласен, что размер разреженной матрицы составляет 8 байт. Я могу что-то упустить, но если я это сделаю, я получу совершенно другой ответ:
>>> import sys
>>> import numpy
>>> from scipy import sparse
>>> A = numpy.array([[0, 0],[0, 1]])
>>> s = sparse.csc_matrix(A)
>>> s
<2x2 sparse matrix of type '<class 'numpy.int32'>'
with 1 stored elements in Compressed Sparse Column format>
>>> sys.getsizeof(s)
56
Это размер структуры данных в памяти, и я вас уверяю, что это точно. Python должен знать, насколько он велик, потому что он выделяет память.
Если, с другой стороны, вы используете s.data.nbytes
:
>>> s.data.nbytes
4
Это дает ожидаемый ответ 4. Ожидается, потому что s
сообщает о себе как о наличии одного сохраненного элемента типа int32
. Возвращаемое значение в соответствии с документами ,
не включает память, занятую неэлементными атрибутами объекта массива.
Это не более точный результат, просто ответ на другой вопрос, как ясно дает 35421869 .
Я не могу объяснить, почему вы сообщаете значение 8 байтов, когда результат 4 явно верен. Одна возможность состоит в том, что numpy.array([[0, 0],[0, 1]])
на самом деле не является тем, что было фактически преобразовано в разреженный массив. Откуда взялась величина 5? Значение 8 соответствует начальному значению numpy.array([[0, 0],[0, 5.0]])
.
Ваша цифра в 12 байтов основана на двух неудовлетворенных ожиданиях.
- можно представить разреженную матрицу в виде списка троек (строка, столбец, значение) . И именно так хранится COO-матрица, по крайней мере, в принципе. Но CSC означает сжатый разреженный столбец , и поэтому в нем меньше явных индексов столбцов, чем в COO-матрице. Эта статья в Википедии дает ясное объяснение того, как на самом деле работает хранилище.
nbytes
не сообщает об общей стоимости памяти для хранения элементов матрицы. Он сообщает numpy
инвариант (по многим различным видам матрицы) x.nbytes == np.prod(x.shape) * x.itemsize
. Это важная величина, поскольку явно сохраненные элементы матрицы образуют ее самую большую вспомогательную структуру данных и должны быть размещены в непрерывной памяти.