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