1

我正在尝试使用reduce()函数来创建一个水平堆叠多个数组的函数hstack() 。作为一个简单的例子,让我们说

>>>>M=eye((4))
>>>>M
    array([[ 1.,  0.,  0.,  0.],
    [ 0.,  1.,  0.,  0.],
    [ 0.,  0.,  1.,  0.],
    [ 0.,  0.,  0.,  1.]])

>>>>hstack([M,M])
array([[ 1.,  0.,  0.,  0.,  1.,  0.,  0.,  0.],
   [ 0.,  1.,  0.,  0.,  0.,  1.,  0.,  0.],
   [ 0.,  0.,  1.,  0.,  0.,  0.,  1.,  0.],
   [ 0.,  0.,  0.,  1.,  0.,  0.,  0.,  1.]])

这可以按我的意愿工作。现在我定义

>>>> hstackm = lambda *args: reduce(hstack, args)

并尝试从上一个案例中执行hstack()

>>>>hstackm([M,M])  
[array([[ 1.,  0.,  0.,  0.],
   [ 0.,  1.,  0.,  0.],
   [ 0.,  0.,  1.,  0.],
   [ 0.,  0.,  0.,  1.]]),
 array([[ 1.,  0.,  0.,  0.],
   [ 0.,  1.,  0.,  0.],
   [ 0.,  0.,  1.,  0.],
   [ 0.,  0.,  0.,  1.]])]

这是不正确的。如何定义hstackm()以获得正确的输出?

如果可能的话,我的最终目标是创建一个hstackm()函数来堆叠 SPARSE 矩阵。就像是,

hstackm = lambda *args: reduce(sparse.hstack, args).

_*args_ 将是csr或 _lil_matrix_

谢谢你

4

2 回答 2

0

您的函数hstack采用一个参数,即矩阵列表。而是用两个参数reduce()调用它,每个参数都是一个矩阵。

更改您的hstack方法以接受任意数量的参数:

def hstack(*matrices):
    ....

而不是hstack(matrices),然后将其称为hstack(M, M)

于 2013-02-14T19:02:19.583 回答
0
In [16]: hstackm = lambda args: reduce(lambda x,y:hstack((x,y)), args)

In [17]: hstackm([M,M])
Out[17]: 
array([[ 1.,  0.,  0.,  0.,  1.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  1.,  0.,  0.,  0.,  1.]])
于 2013-02-14T19:06:54.243 回答