简体   繁体   中英

An array of floats giving a numpy.ndarray object

This is a followup question from the one I posted a few minutes ago . The problem I was having with multiplying int with float is fixed, thanks to user2357112 in the comments. However, it's come across another roadblock.

Code:

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()

Code in ideone: http://ideone.com/DO1otS

Error:

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'

I am confused about why final[i] was recognized as a numpy.ndarray object. I thought that, since final is a 1-dimensional array, final[i] will therefore return the value (a float ) within that array at index i . I'm not sure why that is not the case. Thank you in advance!

This is the answer to your question "I am confused about why final[i] was recognized as a numpy.ndarray object." In the following snippet of code

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

I skipped non-essential code. The code above shows that r is a numpy.ndarray and initial is a list. Then final is a product of a numpy.ndarray and a list. The result of this product is a numpy.ndarray .

What is also important is that r is an array of floats. Therefore final is also an array of floats and not fraction objects. Therefore you cannot call limit_denominator() on elements of final .

In addition, code such as:

for i in tbd:
    del final[i]

looks quite suspicious.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM