我有一个函数需要csr_matrix
并对其进行一些计算。
这些计算的行为要求此矩阵的形状是特定的(比如NxM
)。
我发送的输入具有较少的列和确切的行数。
(例如,它具有形状=(A,B),其中A< N和B == M)
例如:我有对象x
>>>x = csr_matrix([[1,2],[1,2]])
>>>x
(0, 0) 1
(0, 1) 2
(1, 0) 1
(1, 1) 2
>>>x.shape
(2, 2)
功能f
:
def f(csr_mat):
"""csr_mat.shape should be (2,3)"""
然后我想在x
上做一些事情,所以它会变成y
:
>>>y = csr_matrix([[1,2,0],[1,2,0]])
>>>y
(0, 0) 1
(0, 1) 2
(1, 0) 1
(1, 1) 2
>>>y.shape
(2, 3)
在此示例中,x
和y
具有相同的非零值,但y
具有不同的形状。我想要的是有效地“扩展”x
到一个新的维度,用零填充新的列。即,给定x
和new_shape=(2,3)
,它应该返回y
我已经尝试了reshape
:
x.reshape((2,3))
但后来我得到了:
NotImplementedError
我的第二个选择就是创建具有不同形状的新csr_matrix
:
z = csr_matrix(x,shape=(3,3))
但这也失败了:
NotImplementedError:没有为csr_matrix实现重塑。
编辑:使用csc_matrix带来了同样的错误。
任何想法?
由于
答案 0 :(得分:7)
在CSR格式中,所需data
的基础indices
,indptr
和y
数组与x
矩阵的数组相同。您可以使用新的csr_matrix
:
shape
构造函数
y = csr_matrix((x.data, x.indices, x.indptr), shape=(2, 3))
请注意,构造函数默认为copy=False
,因此这将在data
和indices
之间共享indptr
,x
和y
。 y
上的某些操作将反映在x
中。您可以通过copy=True
使x
和y
相互独立。
如果您想查看csr_matrix
的未记录内部,可以设置内部_shape
属性,使x
数组具有您想要的形状:
x._shape = (2, 3)
这样做并没有什么优势。