给出numpy.ndarray对象的浮点数组

时间:2017-08-08 21:52:27

标签: python arrays numpy

这是来自the one I posted a few minutes ago的后续问题。由于注释中的user2357112,我使用浮点数乘以int的问题是固定的。然而,它遇到了另一个障碍。

代码:

from __future__ import division
from fractions import Fraction
import numpy as np
from numpy import linalg as LA

def gcd(m,n):
    if m < n:
        return gcd(n,m)
    return gcd(n,m%n)

def lcm(m,n):
    return (m*n)/(gcd(m,n))

def answer(m):
    tbd = []
    l = len(m)
    for i in range(l):
        s = sum(m[i])
        if s == 0:
            tbd.append(i)
            m[i][i] = 1
        else:
            for j in range(l):
                m[i][j] /= s
    tbd.sort(reverse=True)
    a = np.array(m)
    r = np.diag([1.0 for x in range(l)])
    for i in range(100):
        r *= a
    initial = [0 for x in range(l)]
    initial[0] = 1
    final = initial * r
    for i in tbd:
        del final[i]
    dens = []
    for i in range(len(final)):
        final[i] = final[i].limit_denominator()
        dens.append(final[i].denominator)
    lc = dens[0]
    for j in range(1,len(dens)):
        lc = lcm(lc,dens[j])
    for i in range(len(final)):
        final[i] = int(final[i] * lc)
    final.append(lc)
    return final

def main():
    print answer([[1,2],[2,1]])
    print answer([[0,1,0,0,0,1],[4,0,0,3,2,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0]])

main()

ideone中的代码:http://ideone.com/DO1otS

错误:

Traceback (most recent call last):
  File "prog.py", line 51, in <module>
  File "prog.py", line 48, in main
  File "prog.py", line 37, in answer
AttributeError: 'numpy.ndarray' object has no attribute 'limit_denominator'

我很困惑为什么final[i]被识别为numpy.ndarray对象。我认为,由于final是一维数组,因此final[i]将返回索引float内该数组中的值(i)。我不确定为什么不是这样。提前谢谢!

1 个答案:

答案 0 :(得分:0)

这是你的问题的答案&#34;我对为什么final [i]被识别为numpy.ndarray对象感到困惑。&#34; 在下面的代码片段中< / p>

r = np.diag([1.0 for x in range(l)])
initial = [0 for x in range(l)]
final = initial * r

我跳过了非必要的代码。上面的代码显示rnumpy.ndarrayinitial是列表。然后finalnumpy.ndarray和列表的乘积。该产品的结果是numpy.ndarray

同样重要的是r是一个浮点数组。因此final也是一个浮点数组而不是分数对象。因此,您无法在limit_denominator()的元素上调用final

此外,代码如:

for i in tbd:
    del final[i]

看起来很可疑。