bph*_*bph 9 python numpy greatest-common-divisor
是否numpy有一个gcd功能都在其模块的结构?
我知道fractions.gcd但是认为numpy等效可能更快,并且使用numpy数据类型可以更好地工作.
我一直无法在谷歌上发现任何东西,除了这个看起来过时的链接,我不知道我将如何访问_gcd它建议存在的功能.
天真的尝试:
np.gcd
np.euclid
Run Code Online (Sandbox Code Playgroud)
对我不起作用......
HYR*_*YRY 11
你可以自己写:
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
Run Code Online (Sandbox Code Playgroud)
以下是测试结果和速度的代码:
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
Run Code Online (Sandbox Code Playgroud)
lab*_*idi 10
使用Python 3.5的任何人的公共服务公告
from math import gcd
gcd(2, 4)
Run Code Online (Sandbox Code Playgroud)
如果你想自己写一个单行:
def gcd(a: int, b: int): return gcd(b, a % b) if b else a
Run Code Online (Sandbox Code Playgroud)
似乎还没有任何gcd功能numpy.但是,分数模块中有一个gcd函数.如果需要gcd在numpy数组上执行,可以ufunc使用它构建一个:
gcd = numpy.frompyfunc(fractions.gcd, 2, 1)
Run Code Online (Sandbox Code Playgroud)