NumPy乘以浮点似乎不起作用

时间:2017-08-08 20:04:46

标签: python numpy

我正在研究Google在Python 2.7中的“Doomsday Fuel”问题(它需要在Python 2.7中完成,因此from __future__ import division行)使用NumPy,我承认我并不太熟悉。

WIP代码(为方便起见添加了大量注释):

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

def gcd(m,n):
    '''
    function for finding the greatest common divisor of m and n
    used mostly for the LCM function
    '''
    if m < n:
        return gcd(n,m)
    return gcd(n,m%n)

def lcm(m,n):
    '''
    function for finding the least common multiple of m and n
    using the fact that m*n = gcd(m,n)*lcm(m,n)
    '''
    return (m*n)/(gcd(m,n))

def answer(m):
    '''
    m is an square matrix of nonnegative integers
    dimensions guaranteed to be at most 10x10
    '''
    tbd = [] #stands for To Be Deleted
    l = len(m)
    for i in range(l):
        '''
        Checks each row
        If row i is empty, add i to tbd, then make m[i][i] = 1
        Otherwise, divide row i by the sum of row i to "normalize" it
        e.g. [[3,2],[0,0]] would become [[0.6,0.4],[0,1]]
        '''
        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 for x in range(l)]) #set initial matrix r which is just the identity matrix with same dimensions as a
    for i in range(100):
        r *= a #with each row adding up to just 1, r should stay stable
    initial = [0 for x in range(l)]
    initial[0] = 1
    final = initial * r
    for i in tbd:
        del final[i]
    dens = [] #denominators
    for i in range(len(final)):
        final[i] = final[i].limit_denominator()
        dens.append(final[i].denominator) #collect all denominators
    lc = dens[0]
    for j in range(1,len(dens)):
        lc = lcm(lc,dens[j]) #find LCM of all the denominators
    for i in range(len(final)):
        final[i] = int(final[i] * lc) #multiply the final array (which uses Fractions) by the LCM, then convert elements to int
    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 29, in answer
TypeError: Cannot cast ufunc multiply output from dtype('float64') to dtype('int64') with casting rule 'same_kind'

为什么程序不能将int和float相乘?或者我错过了此错误消息中的其他部分?

0 个答案:

没有答案