Как поднять числовой массив в степень?(соответствует повторным умножениям матриц, не поэлементно) - PullRequest
14 голосов
/ 16 февраля 2011

Я хочу поднять двумерную цифру array, назовем ее A, до степени некоторого числа n, но до сих пор мне не удалось найти функцию или оператор для этого.

Я знаю, что мог бы привести его к типу matrix и использовать тот факт, что затем (аналогично тому, что было бы в Matlab), A**n делает то, что я хочуarray это же выражение означает поэлементное возведение в степень).Кастинг на matrix и обратно кажется довольно уродливым решением.

Конечно, должен быть хороший способ выполнить это вычисление, сохраняя формат array?

Ответы [ 2 ]

24 голосов
/ 16 февраля 2011

Я верю, что вы хотите 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]])
1 голос
/ 31 марта 2011

Функция 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   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...