2次元のnumpyarray
をA
と呼び、数の累乗n
にしたいのですが、これまでのところ、それを行う関数または演算子を見つけることができませんでした。
私はそれをmatrix
型にキャストし、(Matlabでの動作と同様に)A**n
が私が望むことを実行するという事実を使用できることを知っています(array
の場合、同じ式は要素ごとに意味しますべき乗)。ただし、matrix
へのキャストとその逆のキャストは、かなり醜い回避策のようです。
確かに、フォーマットをarray
に保ちながら、その計算を実行するための良い方法が必要ですか?
私はあなたが欲しいと信じています 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]])
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