1. ホーム
  2. python

[解決済み] 行列の各行にnumpy.linalg.normを適用するには?

2023-03-11 23:24:05

質問

2次元の行列があり、各行のノルムをとりたい。しかし、私が使用するとき numpy.linalg.norm(X) を直接使うと、行列全体のノルムを取ります。

各行のノルムを取るには、forループを使い、それぞれの X[i] のノルムを取ることができますが、30k行あるので膨大な時間がかかります。

より速い方法を見つけるために何か提案はありますか?または np.linalg.norm をマトリックスの各行に適用することは可能ですか?

どのように解決するには?

numpy 1.9+の場合

注意点として が示すように は、NumPy バージョン 1.9 の時点では np.linalg.norm(x, axis=1) がL2-normを計算する最速の方法であることを示しています。

numpyの場合 < 1.9

L2-normを計算する場合、直接計算することも可能です( axis=-1 引数を使って)直接計算することができます。

np.sum(np.abs(x)**2,axis=-1)**(1./2)

Lp-normsももちろん同様に計算できます。

よりもかなり高速です。 np.apply_along_axis よりもかなり高速ですが、おそらくそれほど便利ではありません。

In [48]: %timeit np.apply_along_axis(np.linalg.norm, 1, x)
1000 loops, best of 3: 208 us per loop

In [49]: %timeit np.sum(np.abs(x)**2,axis=-1)**(1./2)
100000 loops, best of 3: 18.3 us per loop

その他 ord の形式 norm も直接計算することができます(同様のスピードアップがあります)。

In [55]: %timeit np.apply_along_axis(lambda row:np.linalg.norm(row,ord=1), 1, x)
1000 loops, best of 3: 203 us per loop

In [54]: %timeit np.sum(abs(x), axis=-1)
100000 loops, best of 3: 10.9 us per loop