bph - 1 year ago 222
Python Question

# 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...

You can write it yourself:

``````def numpy_gcd(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
``````
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download