python求零点_python – 计算大序列的过零点的结果不同

这个问题源于查看

this关于计算

zero crossings数量的问题的答案.提供了几个解决问题的答案,但NumPy

appproach在时间上摧毁了其他问题.

问题:为什么NumPy解决方案提供的结果与其他三种解决方案不同? (哪个是正确的?)

以下是计算过零次数的结果:

Blazing fast NumPy solution

total time: 0.303605794907 sec

Zero Crossings Small: 8

Zero Crossings Med: 54464

Zero Crossings Big: 5449071

Loop solution

total time: 15.6818780899 sec

Zero Crossings Small: 8

Zero Crossings Med: 44960

Zero Crossings Big: 4496847

Simple generator expression solution

total time: 16.3374049664 sec

Zero Crossings Small: 8

Zero Crossings Med: 44960

Zero Crossings Big: 4496847

Modified generator expression solution

total time: 13.6596589088 sec

Zero Crossings Small: 8

Zero Crossings Med: 44960

Zero Crossings Big: 4496847

用于获得结果的代码:

import time

import numpy as np

def zero_crossings_loop(sequence):

s = 0

for ind, _ in enumerate(sequence):

if ind+1 < len(sequence):

if sequence[ind]*sequence[ind+1] < 0:

s += 1

return s

def print_three_results(r1, r2, r3):

print 'Zero Crossings Small:', r1

print 'Zero Crossings Med:', r2

print 'Zero Crossings Big:', r3

print '\n'

small = [80.6, 120.8, -115.6, -76.1, 131.3, 105.1, 138.4, -81.3, -95.3, 89.2, -154.1, 121.4, -85.1, 96.8, 68.2]

med = np.random.randint(-10, 10, size=100000)

big = np.random.randint(-10, 10, size=10000000)

print 'Blazing fast NumPy solution'

tic = time.time()

z1 = (np.diff(np.sign(small)) != 0).sum()

z2 = (np.diff(np.sign(med)) != 0).sum()

z3 = (np.diff(np.sign(big)) != 0).sum()

print 'total time: {0} sec'.format(time.time()-tic)

print_three_results(z1, z2, z3)

print 'Loop solution'

tic = time.time()

z1 = zero_crossings_loop(small)

z2 = zero_crossings_loop(med)

z3 = zero_crossings_loop(big)

print 'total time: {0} sec'.format(time.time()-tic)

print_three_results(z1, z2, z3)

print 'Simple generator expression solution'

tic = time.time()

z1 = sum(1 for i, _ in enumerate(small) if (i+1 < len(small)) if small[i]*small[i+1] < 0)

z2 = sum(1 for i, _ in enumerate(med) if (i+1 < len(med)) if med[i]*med[i+1] < 0)

z3 = sum(1 for i, _ in enumerate(big) if (i+1 < len(big)) if big[i]*big[i+1] < 0)

print 'total time: {0} sec'.format(time.time()-tic)

print_three_results(z1, z2, z3)

print 'Modified generator expression solution'

tic = time.time()

z1 = sum(1 for i in xrange(1, len(small)) if small[i-1]*small[i] < 0)

z2 = sum(1 for i in xrange(1, len(med)) if med[i-1]*med[i] < 0)

z3 = sum(1 for i in xrange(1, len(big)) if big[i-1]*big[i] < 0)

print 'total time: {0} sec'.format(time.time()-tic)

print_three_results(z1, z2, z3)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值