web-dev-qa-db-ja.com

numpy配列を累乗する方法は? (要素ごとではなく、繰り返される行列の乗算に対応)

2次元のnumpyarrayAと呼び、数の累乗nにしたいのですが、これまでのところ、それを行う関数または演算子を見つけることができませんでした。

私はそれをmatrix型にキャストし、(Matlabでの動作と同様に)A**nが私が望むことを実行するという事実を使用できることを知っています(arrayの場合、同じ式は要素ごとに意味しますべき乗)。ただし、matrixへのキャストとその逆のキャストは、かなり醜い回避策のようです。

確かに、フォーマットをarrayに保ちながら、その計算を実行するための良い方法が必要ですか?

15
mirari

私はあなたが欲しいと信じています numpy.linalg.matrix_power

簡単な例として:

import numpy as np
x = np.arange(9).reshape(3,3)
y = np.matrix(x)

a = y**3
b = np.linalg.matrix_power(x, 3)

print a
print b
assert np.all(a==b)

これにより、次のようになります。

In [19]: a
Out[19]: 
matrix([[ 180,  234,  288],
        [ 558,  720,  882],
        [ 936, 1206, 1476]])

In [20]: b
Out[20]: 
array([[ 180,  234,  288],
       [ 558,  720,  882],
       [ 936, 1206, 1476]])
24
Joe Kington

Opencv関数cvPowは、有理数に上げると、私のコンピューターでは約3〜4倍高速になるようです。以下にサンプル関数を示します(pyopencvモジュールをインストールする必要があります)。

import pyopencv as pycv
import numpy
def pycv_power(arr, exponent):
    """Raise the elements of a floating point matrix to a power. 
    It is 3-4 times faster than numpy's built-in power function/operator."""
    if arr.dtype not in [numpy.float32, numpy.float64]:
        arr = arr.astype('f')
    res = numpy.empty_like(arr)
    if arr.flags['C_CONTIGUOUS'] == False:
        arr = numpy.ascontiguousarray(arr)        
    pycv.pow(pycv.asMat(arr), float(exponent), pycv.asMat(res))
    return res   
0
Lennart Liberg