这是来自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
)。我不确定为什么不是这样。提前谢谢!
答案 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
我跳过了非必要的代码。上面的代码显示r
是numpy.ndarray
,initial
是列表。然后final
是numpy.ndarray
和列表的乘积。该产品的结果是numpy.ndarray
。
同样重要的是r
是一个浮点数组。因此final
也是一个浮点数组而不是分数对象。因此,您无法在limit_denominator()
的元素上调用final
。
此外,代码如:
for i in tbd:
del final[i]
看起来很可疑。