用花式索引修改Space矩阵

2024-10-02 22:33:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用奇特的索引来修改一个大的稀疏矩阵。假设您有以下代码:

import numpy as np
import scipy.sparse as sp

a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
b = sp.lil_matrix(a)
c = sp.lil_matrix((3,4))
c[[1,2], 0] = b[[1,2], 0]

但是,此代码会出现以下错误:

ValueError: shape mismatch in assignment

我不明白为什么这样不行。这两个矩阵具有相同的形状,如果两个矩阵都是numpy数组,则这通常有效。我将感谢任何帮助


Tags: 代码importnumpyas错误np矩阵scipy
1条回答
网友
1楼 · 发布于 2024-10-02 22:33:40

是的,这是一个稀疏__setitem__的bug。我以前也遇到过(但我只是解决了这个问题)。现在我真的调查过了;首先,您可以非常轻松地解决此问题:

import numpy as np
import scipy.sparse as sp

a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
b = sp.lil_matrix(a)
c = sp.lil_matrix((3,4))
c[[1,2], 0] = b[[1,2], 0]

这将引发您看到的ValueError。这不符合预期,并且按照预期工作:

c[[1,2], 0] = b[[1,2], [0]]

>>> c.A
array([[0., 0., 0., 0.],
       [5., 0., 0., 0.],
       [9., 0., 0., 0.]])

让我们只看一下the offending ^{}(我将省略许多没有被调用的代码):

row, col = self._validate_indices(key)

这很好row = [1, 2]col = 0

col = np.atleast_1d(col)
i, j = _broadcast_arrays(row, col)

到目前为止还不错{}和{}

if i.ndim == 1:
# Inner indexing, so treat them like row vectors.
    i = i[None]
    j = j[None]

broadcast_row = x.shape[0] == 1 and i.shape[0] != 1
broadcast_col = x.shape[1] == 1 and i.shape[1] != 1

这是我们的问题-ij都变成了具有(1, 2)形状的行向量x这是您试图分配的(b[[1,2], 0]),其形状为(2, 1);下一步将引发ValueError原因x,并且索引不对齐

>>> c[[1,2], 0] = b[[1,2], 0].A

ValueError: cannot reshape array of size 4 into shape (2,)

这里有同样的问题,但是__setitem__x广播到(2,2)数组中,然后该数组再次失败,因为它比您分配给它的数组大

解决方法(b[[1,2], [0]])的形状为(1, 2),这是不正确的,但该错误最终会消除索引c中的错误

我不确定这个索引代码背后的逻辑到底是什么,所以我不确定如何在不引入其他微妙bug的情况下修复它

相关问题 更多 >