【问题标题】:Numpy's matrix_power function giving wrong results for large exponents [duplicate]Numpy的matrix_power函数为大指数给出错误的结果[重复]
【发布时间】:2017-01-27 23:38:16
【问题描述】:

我正在使用Q-Matrix method 在 Numpy 中实现斐波那契数列。直到 n = 47,结果都很好。此时,matrix_power 函数正在返回 incorrect results。关于为什么会发生这种情况的任何解释?

import numpy
def fibonacci(n):
    qmatrix = numpy.matrix([[1, 1], [1, 0]])
    (a,b,c,d) = numpy.linalg.matrix_power(qmatrix,n).flatten().tolist()[0]
    return b
print fibonacci(47) # Outputs -1323752223

【问题讨论】:

  • 你确定吗?我得到2971215073。如果是平台问题,请尝试将矩阵转换为另一种类型,例如 numpy.linalg.matrix_power(qmatrix,n).astype(numpy.uint64).flatten().tolist()[0]
  • 谢谢,确实这似乎是一个平台问题。对于n = 47,强制转换为numpy.uint32 可以修复结果,但对于较大的值又会出错。我以前不需要做演员,让这个工作的最佳方法是什么?
  • 您可以阅读this。基本上是一个小整数,比如说 4 位,不能容纳一个很大的值,当你要求显示它时它会做一些奇怪的事情,所以你强制转换数组以解决这个问题。据我所知,uint64 是你能得到的最大的,但我不是专家。

标签: python numpy fibonacci


【解决方案1】:

如果您要玩弄斐波那契数,可能需要牺牲一些速度并使用 Python 的任意大整数。您可以通过将矩阵的 dtype 设置为 object 来做到这一点。

您也不需要使用np.matrix 对象,坚持使用普通数组几乎总是更好。您可以提取相关项目而无需将数组转换为列表:

def fibonacci(n):
    qmatrix = numpy.array([[1, 1], [1, 0]], dtype=object)
    return numpy.linalg.matrix_power(qmatrix, n)[0, 1]

【讨论】:

  • 太棒了,这很完美。根据 Q 矩阵定理,您的代码中需要进行的一项编辑是返回值应位于索引 [0,1] 处。所以不会让我编辑,因为它只是一个字符:\
  • 啊,你是对的!已经修好了。
  • cumprod 可用于获得这些qmatrix 的全部权力(使用np.matrix 版本)stackoverflow.com/a/47444215/901925
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多