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)
它最终创建了一个dtypeobject
的标量数组,因为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)