首页   注册   登录
 dwjgwsm 最近的时间轴更新

dwjgwsm

  •   V2EX 第 275684 号会员,加入于 2017-12-20 09:05:11 +08:00
    dwjgwsm 最近回复了
    3 天前
    回复了 dwjgwsm 创建的主题 Python 请问正则表达式如何排除一个特定的单词?
    @xiangyuecn 谢谢~!也可以这么写:
    x=r'\([^()]*\)'

    x=r'\b(?!MAX)[A-Z]+?' + x
    @ipwx 试过了,基本上看不出提升效果.

    import numpy as np
    cimport numpy as np
    cimport cython
    np.seterr(invalid='ignore')
    cdef int CMAX(int x,int y):
    return x if x>y else y
    cdef int CMIN(int x,int y):
    return y if x>y else x

    DTYPE1 = np.float
    DTYPE2 = np.int
    ctypedef np.float_t DTYPE1_t
    ctypedef np.int_t DTYPE2_t
    @cython.boundscheck(False)
    @cython.wraparound(False)
    def MA(np.ndarray[DTYPE1_t, ndim=1] npdata,np.ndarray[DTYPE2_t, ndim=1] n):
    cdef int L=npdata.shape[0]
    cdef int i=0
    cdef np.ndarray res=np.zeros(L)
    for i from 0<=i<L:
    try:
    res[i]=np.mean(npdata[i + 1 - n[i]: i + 1])
    except:
    res[i] =np.nan
    return res
    @Kirscheis 谢谢你讲的这么详细,我不是科班出身啊,没学过这些算法.不过大家说的前缀和,线段树,dp,我网上大致看了一下.大体的思路就是把数据分割小,避免重复计算.回头去买本算法的书学一下吧.我觉得作用可能不会很大,因为我的情况不是数据长度很大. 先说一下测试结果:
    测试了长度为 10 万的数据,
    1.在 python 中,map 和列表推导速度基本相同,大概是 2 秒
    2.在参数检查中 not np.isnan()会将速度降低 40%左右,这是之前没注意到的
    3.对比 cython 和 python,cython 列表推导只比 python 快 12%(想试一下 map,结果还不知道怎么实现,cython 中好像无法实现子函数,编译报错)
    @RecursiveG 数据长度几百,但是调用频率特别高,还有其他十几个类似的函数,所以总体运行下来慢的要死,必须想办法从各种角度优化
    def MA(npdata,narr): #narr 是一个和 npdata 等长的 ndarray 数组
    L=len(npdata)
    j=np.arange(1,L+1) #当时还不知道有 enumerate 这个东西,所以传了一个定位数组进去(从 aijam 那儿学了一招,谢谢!)
    def IMA(n, k):
    if k < n or n<0 or np.isnan(n):
    return np.nan
    return np.mean(npdata[k - int(n):k])

    return np.array(list(map(IMA, narr, j)))

    其实就是和 aijam 一样的遍历算法. 我待会儿试试用列表推导和 map 哪个快,之前网上说应该是 map 快.
    之前没有装 cython.昨天买了一个大硬盘重装了系统,把 cython 装上去了(因为 vs 的缘故).准备上 cython 看看.回头报告结果
    @RecursiveG 我先把我写的函数放上来吧,当时我觉得没必要贴一坨代码.刚从外面回来,楼上的各位回复还没仔细看.贴完了,在慢慢看
    @jmc891205 我觉得恐怕不行,线段树的每个数组起始点和结束点不同.
    @aijam 我就是这么做的,不过我是用 map 一个子函数来实现的,子函数做了一点参数检查
    @Kirscheis 对的,a b 数组长度相等, 我再描述一下吧,我们计算平均值,都有个参数 n:n 个数字的平均值, 在这里,数组 b=np.array([2,4,3,5,2,1,4,5,3,2])的每个元素都是对应位置的 n ,比如返回数组是 result_arr,则:

    result_arr[9]=(a[8]+a[9])/b[9] #b[9]==2,所以是 2 个元素的平均值
    result_arr[8]=(a[6]+a[7]+a[8])/b[8] #b[8]==3,所以是 3 个元素的平均值

    不过大哥,你说的我表示完全看不懂啊. 你说"这是 dp 的例题",出自哪里啊?
    @jmc891205 比如最后一个 8.5=(a[8]+a[9])/b[9]
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   2834 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.0 · 10ms · UTC 08:22 · PVG 16:22 · LAX 01:22 · JFK 04:22
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1