Python scipy.sparse表示numpy.random\u multivariable\u normal

Python scipy.sparse表示numpy.random\u multivariable\u normal,python,numpy,scipy,Python,Numpy,Scipy,我想节省一点内存,并想创建一个scipy.sparse标识矩阵(dim有数千个,不可怕,但也不节俭)。请注意,它的形状通过了assert: cov = sigma_0 * sparse.identity(dim, dtype=np.float32) assert (dim, dim) == cov.shape result = np.random.multivariate_normal(mu, cov) 但是,以下方法可以很好地工作: cov = sigma_0 * np.identity(d

我想节省一点内存,并想创建一个
scipy.sparse
标识矩阵(
dim
有数千个,不可怕,但也不节俭)。请注意,它的形状通过了
assert

cov = sigma_0 * sparse.identity(dim, dtype=np.float32)
assert (dim, dim) == cov.shape
result = np.random.multivariate_normal(mu, cov)
但是,以下方法可以很好地工作:

cov = sigma_0 * np.identity(dim, dtype=np.float32)
assert (dim, dim) == cov.shape
result = np.random.multivariate_normal(mu, cov)

我是否在文档的某个地方漏掉了这样一句话,即稀疏协方差矩阵预期会因
ValueError
而失败?

这里发生的是,在输入数组中被转换为数组:

cov=np.数组(cov)
它最终创建了一个dtype
object
的标量数组,因为numpy对稀疏矩阵一无所知

In [3]: cov = sparse.identity(100, dtype=np.float32)

In [4]: cov.shape
Out[4]: (100, 100)

In [5]: np.array(cov)
Out[5]: 
array(<100x100 sparse matrix of type '<type 'numpy.float32'>'
        with 100 stored elements (1 diagonals) in DIAgonal format>, dtype=object)
[3]中的
:cov=sparse.identity(100,dtype=np.float32)
在[4]中:cov.形状
Out[4]:(100100)
In[5]:np.数组(cov)
出[5]:
数组(,dtype=object)

我可能错了,但我不相信
numpy
知道稀疏矩阵。一般来说,稀疏矩阵实现了许多与numpy数组相同的函数,但是如果这些函数被传递到C代码中,那么我打赌numpy函数将无法工作。通常,您可以期望
scipy.sparse
中的大多数函数使用稀疏矩阵。
numpy
函数如果将操作委托给数组自己的方法,则使用稀疏矩阵。否则,他们会天真地尝试将矩阵转换为numpy数组,结果弄错了
cov.toarray()
是将稀疏矩阵转换为密集矩阵的正确方法。
In [3]: cov = sparse.identity(100, dtype=np.float32)

In [4]: cov.shape
Out[4]: (100, 100)

In [5]: np.array(cov)
Out[5]: 
array(<100x100 sparse matrix of type '<type 'numpy.float32'>'
        with 100 stored elements (1 diagonals) in DIAgonal format>, dtype=object)