是否可以在NumPy中创建一个没有行或列的虚拟稀疏矩阵?

时间:2014-01-24 13:25:19

标签: python numpy matrix scipy sparse-matrix

我正在使用SciPy处理稀疏矩阵数组,有时一些矩阵没有行或列(即shape = (0,0))。我希望我的各种其他函数可以忽略这些矩阵,或者执行其他一些智能默认操作。

似乎我不能使用任何稀疏矩阵格式,因为它们抱怨“无效形状”。出于某种原因,matrix([])matrix([[]])shape = (1,0),所以这些都不太好(实际上,这是一个错误吗?这没什么意义......)。

我知道我可以使用None[]array([])或类似内容。然而,标准矩阵操作函数在交付时会失败,这意味着我需要分散

if block is not None:
在我的代码中

或类似的。

是否有一个我错过的矩阵类,这将允许我优雅地处理这些情况?


对于任何好奇的人:这是通过变量类型将有限元Jacobian matrix切割成块来实现的。其中一些变量可以固定(固定为常数值),因此没有衍生物。因此雅各比派中没有条目。

4 个答案:

答案 0 :(得分:3)

是。你可以做到

from scipy import sparse
result = sparse.eye(0)
# result.shape = (0, 0)

答案 1 :(得分:1)

矩阵([[]]) - > shape =(1,0)非常有意义;你给它一行,零列;怎么numpy应该猜测你真正想要的是零行呢?

所有数组创建函数(如np.zeros((0,0))都可以用于您的目的。

答案 2 :(得分:1)

有很多方法可以创建0x0稀疏矩阵。例如,

In [16]: from scipy.sparse import csr_matrix, coo_matrix, dok_matrix, eye

In [17]: csr_matrix(([], [[],[]]), shape=(0,0))
Out[17]: 
<0x0 sparse matrix of type '<type 'numpy.float64'>'
with 0 stored elements in Compressed Sparse Row format>

In [18]: coo_matrix(([],[[],[]]), shape=(0,0))
Out[18]: 
<0x0 sparse matrix of type '<type 'numpy.float64'>'
with 0 stored elements in COOrdinate format>

In [19]: dok_matrix((0,0))
Out[19]: 
<0x0 sparse matrix of type '<type 'numpy.float64'>'
with 0 stored elements in Dictionary Of Keys format>

In [20]: eye(0)
Out[20]: 
<0x0 sparse matrix of type '<type 'numpy.float64'>'
with 0 stored elements (1 diagonals) in DIAgonal format>

In [21]: csr_matrix(np.zeros((0, 0)))
Out[21]: 
<0x0 sparse matrix of type '<type 'numpy.float64'>'
with 0 stored elements in Compressed Sparse Row format>

你说你正在砍掉雅可比矩阵。如果你索引 一个稀疏矩阵,切片长度为零,你会得到 一个0x0的结果:

In [22]: a = np.random.randint(0, 2, size=(10,10))

In [23]: m = csr_matrix(a)

In [24]: m[3:3, 3:3]
Out[24]: 
<0x0 sparse matrix of type '<type 'numpy.int64'>'
with 0 stored elements in Compressed Sparse Row format>

(我正在使用scipy 0.13.2。)

有些稀疏操作可能无法正确处理0x0矩阵,这可能是一个错误。如果您有一些示例,可以将它们添加到您的问题中吗?

答案 3 :(得分:0)

您可以尝试以下代码,这很容易。

将numpy导入为np np.zeros((0,0))