numpy
在模块结构的某处有gcd
函数吗?
我知道fractions.gcd
但认为numpy
等效可能更快,并且使用numpy
数据类型可以更好地工作。
除了link之外,我一直无法发现Google上的任何内容,这似乎过时了,我不知道如何访问它建议存在的_gcd
函数。
天真地尝试:
np.gcd
np.euclid
对我不起作用......
答案 0 :(得分: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
以下是测试结果和速度的代码:
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
答案 1 :(得分:10)
使用Python 3.5的任何人的公共服务公告
from math import gcd
gcd(2, 4)
如果你想自己写一篇文章:
def gcd(a: int, b: int): return gcd(b, a % b) if b else a
答案 2 :(得分:7)
gcd
似乎还没有numpy
功能。但是,有一个gcd function in fractions module。如果您需要在gcd
数组上执行numpy
,则可以使用它构建ufunc
:
gcd = numpy.frompyfunc(fractions.gcd, 2, 1)
答案 3 :(得分:1)
如果所需的结果不是元素gcd而是数组中所有数字的gcd,则可以使用下面的代码。
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:
return 1
return gcd
根据用例,省略排序步骤a = np.unique(a)
会更快。
使用ufuncs的替代(可能更优雅但更慢)实现是
import numpy as np
from math import gcd as mathgcd
npmathgcd = np.frompyfunc(mathgcd, 2, 1)
def numpy_set_gcd2(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.")
npmathgcd.at(a[1:], np.arange(a.size-1), a[:-1])
return a[-1]
答案 4 :(得分:1)