可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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: