繁体   English   中英

如何将numpy数组提升为幂? (对应于重复的矩阵乘法,而不是元素)

[英]How to raise a numpy array to a power? (corresponding to repeated matrix multiplications, not elementwise)

我想提出一个二维numpy array ,让我们称之为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   

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM