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 数组,这通常有效。我将不胜感激任何帮助。
解决方案
是的,这是 sparse 的错误__setitem__
。我以前遇到过它(但我只是解决了它)。现在我实际上调查了它;首先,你可以很容易地解决这个问题:
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.]])
让我们来看看有问题__setitem__
的地方(我将省略很多没有被调用的代码):
row, col = self._validate_indices(key)
这很好 -row = [1, 2]
而且col = 0
col = np.atleast_1d(col)
i, j = _broadcast_arrays(row, col)
到目前为止一切顺利 -i = [1, 2]
而且j = [0, 0]
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
这是我们的问题 -i
两者j
都变成了 shape 的行向量(1, 2)
。x
这是您要分配的 ( b[[1,2], 0]
),它是 shape (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)
不正确,但该错误最终会抵消 indexing 中的错误c
。
我不确定这个索引代码背后的逻辑究竟是什么,所以我不确定如何在不引入其他细微错误的情况下解决这个问题。
推荐阅读
- c++ - 向量和向量有什么区别
, 向量 a[n] 和向量 一个)? - docker - docker 中的 Netstat 不显示以不同用户身份启动的进程的 PID
- keras - Keras DQN 模型中的自定义噪声层
- mysql - “一且仅一”和“零或一”之间的区别(在 MySQL Workbench 中)
- ios - Firebase - iPhone X 上的 iOS 应用安装不起作用
- sql - 创建最小值和最大值并将它们与时间戳值 sql 进行比较
- python - 如果第一个规则优先级已使用 elbv2 create_rule 设置为“1”,如何在侦听器规则之上插入新的 elbv2 规则?
- javascript - 十进制值到 rgb 并返回到十进制
- r - 多重二项式 GAM (MGCV) 和/或多重逻辑回归的模型选择
- node.js - 在 ReactJS 中引用图像的问题