我想要提升一个二维numpy array
,让我们称之为A
,使用某个数字n
的力量,但我迄今未能找到该函数或运营商这样做。
我知道我可以将其转换为matrix
类型并使用当时的事实(类似于Matlab中的行为),A**n
正是我想要的,(对于array
,相同的表达式意味着元素取幂)。然而,投射到matrix
然后回来似乎是一个相当丑陋的工作方式。
当然,必须有一种很好的方法来执行该计算,同时将格式保持为array
?
答案 0 :(得分:23)
我相信你想要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 :(得分:1)
当提升到有理数时,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