如何将 numpy 数组求幂?(对应于重复矩阵乘法,而不是逐元素操作)

22

我想对一个二维的numpy array(称之为A)进行幂运算,幂指数为n,但我一直没有找到可用的函数或操作符来实现。

我知道可以将其转换为matrix类型并使用类似 MATLAB 中的操作符A**n,这样可以得到我想要的结果。(对于array类型,该表达式表示逐元素求幂)。但是,将其转换为matrix类型再转回来看起来有些不太优雅。

肯定有更好的方法在保持array格式的情况下执行计算吧?


1
虽然Joe Kingston指出了这是可能的,但请注意数组和矩阵在本质上是不同的。数组是一个多维数值元素集合,而矩阵是一个抽象对象(由2-d数组表示)--就像向量和1-d数组之间的区别一样。(将水果清单表示为[1,2,3]的数组,其中1个苹果,2个橙子,3个香蕉是有意义的,但将其表示为向量则没有意义--苹果不能相加/相乘/转化为橙子)。因此,数组具有逐元素操作,而矩阵具有矩阵乘法、det()等操作。 - dr jimbob
如果您喜欢Joe的回答,您应该将其标记为“已接受”,以表彰Joe并让其他人知道这个问题已经解决。 - Sven Marnach
2个回答

35

我认为你想使用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]])

我感到有点羞愧,因为我没有想到要明确查找linalg模块,但特别感谢您指出那也是一个地方。很好的快速示例;非常具有说明性。 - mirari

-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   

pow函数将矩阵中的每个值提高到不同的n次幂,这与矩阵幂不同,矩阵幂将矩阵乘以自身n次。 - Emmanuel Murairi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接