reduce()hstack python

时间:2013-02-14 18:59:39

标签: python reduce sparse-matrix

我正在尝试使用 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 _

谢谢

2 个答案:

答案 0 :(得分:0)

您的函数hstack带有一个参数,一个矩阵列表。 reduce()使用两个参数来调用它,每个参数都是一个矩阵。

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

def hstack(*matrices):
    ....

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

答案 1 :(得分: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.]])