我正在尝试使用 numpy 获取 Python 列表/矩阵的“功能”。我当前唯一的工作解决方案是使用 np.dot() 的迭代函数:
def matr_power(matrix, power):
matrix_a = list(matrix)
matrix_b = list(matrix)
for i in range(0, power-1):
matrix_a = np.dot(matrix_a, matrix_b)
return matrix_a
这可以满足我的需求,但我知道这可能不是最有效的方法。
我尝试将列表转换为 numpy 数组,对其执行幂运算,然后返回列表,以便它可以我需要的形式使用。转换似乎发生了,但功率计算却没有发生。
while (foo != bar):
matr_x = np.asarray(matr_a)
matr_y = matr_x ** n
matr_out = matr_y.tolist()
n += 1
# Other code here to output certain results
问题是,矩阵按预期转换为数组,但在执行幂运算时 (**
) matr_y
最终与 matr_x
就好像从未执行过任何计算一样。我尝试过使用 np.power(matr_y, n) 以及 Stack Overflow 上相关问题中找到的其他一些解决方案。
我尝试过使用 numpy 文档,但是(要么我误解了它,要么)它只是确认这应该按预期工作。
在 PyCharm 中检查调试控制台时,一切似乎都很好(所有矩阵/列表/数组都按预期进行转换),除了计算 matr_x ** i
似乎从未被计算(或者从未存储)在matr_y
中)。
回答
尽管可以将 numpy 矩阵与 **
运算符一起使用,但最佳解决方案是将 numpy 数组(因为 numpy 矩阵已弃用)与 numpy 的 linalg matrix_power 方法结合使用。
matr_x = np.array(mat_a)
matr_y = np.linalg.matrix_power(matr_x, path_length)
work_matr = matr_y.tolist()
现在很明显,如果我没有使用邻接矩阵(只有零和一),**
的逐元素功能可能已经更早被发现。
最佳答案
(至少)有两种使用 numpy 计算矩阵幂的选项,无需多次调用 dot
:
- 使用
numpy.linalg.matrix_power
. - 使用 numpy
matrix
类,它将**
定义为矩阵代数幂。
例如,
In [38]: a
Out[38]:
array([[0, 1, 0],
[1, 0, 1],
[0, 1, 0]])
In [39]: np.linalg.matrix_power(a, 2)
Out[39]:
array([[1, 0, 1],
[0, 2, 0],
[1, 0, 1]])
In [40]: np.linalg.matrix_power(a, 3)
Out[40]:
array([[0, 2, 0],
[2, 0, 2],
[0, 2, 0]])
In [41]: m = np.matrix(a)
In [42]: m ** 2
Out[42]:
matrix([[1, 0, 1],
[0, 2, 0],
[1, 0, 1]])
In [43]: m ** 3
Out[43]:
matrix([[0, 2, 0],
[2, 0, 2],
[0, 2, 0]])
关于python - Numpy 2D Array - Power Of - 不返回答案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41980536/