稀疏矩阵hstack有关可订阅性的错误

时间:2019-03-08 10:10:29

标签: python scipy

请有人解释为什么这行不通吗?

from scipy.sparse import coo_matrix, hstack
row = np.array([0,3,1,0])
col = np.array([0,3,1,2])
data = np.array([4,5,7,9])

temp = coo_matrix((data, (row, col)))
temp_stack = coo_matrix([0, 11,22,33], ([0, 1,2,3], [0, 0,0,0]))
temp_res = hstack(temp, temp_stack)

我收到一个错误,提示coo_matrix无法下标,但是我不明白为什么,看来我正在连接兼容维的矩阵。

1 个答案:

答案 0 :(得分:1)

首先请注意,hstack的第一个参数应该是一个包含要堆叠的数组的元组,因此应使用hstack((temp, temp_stack))来调用它。

接下来,temp的形状为(4, 4)temp_stack的形状为(1, 4)。这些形状不能hstack编辑。预期结果是什么形状?如果要创建形状为(5, 4)的结果,请使用vstack

In [28]: result = vstack((temp, temp_stack))

In [29]: result.A
Out[29]: 
array([[ 4,  0,  9,  0],
       [ 0,  7,  0,  0],
       [ 0,  0,  0,  0],
       [ 0,  0,  0,  5],
       [ 0, 11, 22, 33]], dtype=int64)

如果您要让temp_stack具有形状(4, 1),请通过在coo_matrix的调用中添加额外的括号来修正其创建方式:

In [38]: temp_stack = coo_matrix(([0, 11, 22, 33], ([0, 1, 2, 3], [0, 0, 0, 0])))

In [39]: temp_stack.shape
Out[39]: (4, 1)

In [40]: result = hstack((temp, temp_stack))

In [41]: result.A
Out[41]: 
array([[ 4,  0,  9,  0,  0],
       [ 0,  7,  0,  0, 11],
       [ 0,  0,  0,  0, 22],
       [ 0,  0,  0,  5, 33]], dtype=int64)

顺便说一句,我认为这是一个SciPy错误

temp_stack = coo_matrix([0, 11,22,33], ([0, 1,2,3], [0, 0,0,0]))

不会引发错误。该呼叫等同于

temp_stack = coo_matrix(arg1=[0, 11,22,33], shape=([0, 1,2,3], [0, 0,0,0]))

,并且该shape值显然无效。对coo_matrix的调用应引发一个ValueError。我在SciPy github网站上为此创建了一个问题:https://github.com/scipy/scipy/issues/9919