Numpy gcd function

匿名 (未验证) 提交于 2019-12-03 01:06:02

问题:

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

回答1:

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


回答2:

It seems there is no gcd function yet in numpy. However, there is a gcd function in fractions module. If you need to perform gcd on numpy arrays, you could build a ufunc using it:

gcd = numpy.frompyfunc(fractions.gcd, 2, 1)


回答3:

Public service announcement for anyone using Python 3.5

from math import gcd gcd(2, 4)

And if you want to write it yourself in a one-liner:

def gcd(a: int, b: int): return gcd(b, a % b) if b else a


回答4:

In case the desired result is not an element-wise gcd but rather the gcd of all numbers in the array, you may use the code below.

import numpy as np from math import gcd as mathgcd  def numpy_set_gcd(a):     a = np.unique(a)     if not a.dtype == np.int or a[0] <= 0:         raise ValueError("Argument must be an array of positive " +                          "integers.")      gcd = a[0]     for i in a[1:]:         gcd = mathgcd(i, gcd)         if gcd == 1:
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!