Python 如何将numpy阵列提升为幂?(对应于重复的矩阵乘法,而非元素)

Python 如何将numpy阵列提升为幂?(对应于重复的矩阵乘法,而非元素),python,numpy,scipy,Python,Numpy,Scipy,我想将一个二维numpyarray,我们称之为a,提升到某个数字的幂次n,但到目前为止,我还没有找到这样做的函数或操作符 我知道我可以将其转换为矩阵类型,然后使用这样的事实(类似于Matlab中的行为),A**n正是我想要的(对于数组而言,相同的表达式意味着元素幂运算)。不过,在《黑客帝国》和《黑客帝国》之间来回切换似乎是一个相当丑陋的解决办法 当然,一定有一种很好的方法来执行该计算,同时将格式保持为数组?我相信您想要的 举个简单的例子: import numpy as np x = np.ar

我想将一个二维numpy
array
,我们称之为
a
,提升到某个数字的幂次
n
,但到目前为止,我还没有找到这样做的函数或操作符

我知道我可以将其转换为
矩阵
类型,然后使用这样的事实(类似于Matlab中的行为),
A**n
正是我想要的(对于
数组
而言,相同的表达式意味着元素幂运算)。不过,在《黑客帝国》和《黑客帝国》之间来回切换似乎是一个相当丑陋的解决办法

当然,一定有一种很好的方法来执行该计算,同时将格式保持为
数组

我相信您想要的

举个简单的例子:

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模块):


正如Joe Kingston所指出的,数组和矩阵是完全不同的。
数组
是多维元素的数字集合,其中
矩阵
是一个抽象对象(由二维数组表示)——与向量和一维数组的区别相同。(水果库存是[1,2,3]的数组,表示1个苹果、2个橙子、3个香蕉,这是有意义的,但对于向量来说没有意义——苹果不能添加/复制/转换为橙子)。因此,数组具有逐元素操作,矩阵具有矩阵乘法、det()等。如果您喜欢Joe的答案,您应该将其检查为“已接受”,以表彰Joe,并让其他人知道这个问题已得到解决。是的,这正是我所需要的。非常感谢。我觉得有点不好意思,因为我没有考虑清楚地查看
linalg
模块,但特别感谢您指出这也是一个好地方。很好的快速示例;很能说明问题。
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