Search code examples
pythonnumpygreatest-common-divisor

Numpy gcd function


Does numpy have a gcd function somewhere in its structure of modules?

I'm aware of fractions.gcd but thought a numpy equivalent maybe potentially quicker and work better with numpy datatypes.

I have been unable to uncover anything on google other than this link which seems out of date and I don't know how I would access the _gcd function it suggests exists.

Naively trying:

np.gcd
np.euclid

hasn't worked for me...


Solution

  • You can write it yourself:

    def numpy_gcd(a, b):
        a, b = np.broadcast_arrays(a, b)
        a = a.copy()
        b = b.copy()
        pos = np.nonzero(b)[0]
        while len(pos) > 0:
            b2 = b[pos]
            a[pos], b[pos] = b2, a[pos] % b2
            pos = pos[b[pos]!=0]
        return a
    

    Here is the code to test the result and speed:

    In [181]:
    n = 2000
    a = np.random.randint(100, 1000, n)
    b = np.random.randint(1, 100, n)
    al = a.tolist()
    bl = b.tolist()
    cl = zip(al, bl)
    from fractions import gcd
    g1 = numpy_gcd(a, b)
    g2 = [gcd(x, y) for x, y in cl]
    print np.all(g1 == g2)
    
    True
    
    In [182]:
    %timeit numpy_gcd(a, b)
    
    1000 loops, best of 3: 721 us per loop
    
    In [183]:
    %timeit [gcd(x, y) for x, y in cl]
    
    1000 loops, best of 3: 1.64 ms per loop