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()を定義するにはどうすればよいですか?

私の最終的な目的は、可能であればSPARSE行列をスタックするhstackm()関数を作成することです。何かのようなもの、

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

_*args_はcsrまたは_lil_matrix_になります

ありがとうございました

4

2 に答える 2

0

関数hstackは、行列のリストである1 つのパラメーターを受け取ります。代わりに、それぞれが行列である2 つのパラメーター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 に答える