我正在尝试使用 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 _
谢谢
答案 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.]])